我有以下表格结构
CREATE TABLE `table` ( `id` int(11) NOT NULL auto_increment, `date_expired` datetime NOT NULL, `user_id` int(11) NOT NULL, `foreign_id` int(11) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `date_expired` (`date_expired`,`user_id`,`foreign_id`), KEY `user_id` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
正如您将注意到的,我在user_id上有重复的索引:date_expired
&user_id
.我当然想要唯一的索引,因为我想确保数据是唯一的.
重复索引的原因是因为没有user_id
索引,我的主搜索查询需要4秒.使用额外的索引需要1秒钟.查询正在加入表user_id
并进行检查date_expired
.
该表只有275条记录.
在同一个字段上拥有唯一且正常的索引有多糟糕?
当表是纯粹的id时,拥有比数据更大的索引有多糟糕?
Kendrick Eri.. 8
我相信,如果您创建唯一索引为(user_id
,date_expired
,foreign_id
),你会得到在具有正常指数同样的益处user_id
只用唯一索引.MySQL可以使用任何索引的第一列来减少连接中的行数,其方式与索引相同user_id
.
有关更多信息,请参阅MySQL的索引文档.
您是指id
在架构中的其他位置使用auto_increment列来节省空间吗?由于您的唯一索引涵盖了表中的所有其他列,因此它本质上是主键本身,如果不是,则可以删除.
您可以通过在EXPLAIN前面添加前缀来查看查询所使用的密钥.
我相信,如果您创建唯一索引为(user_id
,date_expired
,foreign_id
),你会得到在具有正常指数同样的益处user_id
只用唯一索引.MySQL可以使用任何索引的第一列来减少连接中的行数,其方式与索引相同user_id
.
有关更多信息,请参阅MySQL的索引文档.
您是指id
在架构中的其他位置使用auto_increment列来节省空间吗?由于您的唯一索引涵盖了表中的所有其他列,因此它本质上是主键本身,如果不是,则可以删除.
您可以通过在EXPLAIN前面添加前缀来查看查询所使用的密钥.