Mysql 在同一列上有一个唯一且正常的索引有多大的错误?
我有下面的表结构Mysql 在同一列上有一个唯一且正常的索引有多大的错误?,mysql,indexing,unique-index,Mysql,Indexing,Unique Index,我有下面的表结构 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`,`f
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;
您会注意到,我在用户id上有重复的索引:date\u expired
&user\u id
。我当然想要唯一索引,因为我想确保数据是唯一的
重复索引的原因是,如果没有用户id
索引,我的主搜索查询需要4秒钟。使用额外的索引需要1秒。查询正在加入user\u id
上的表,并检查date\u expired
这个表只有275条记录
- 在同一个字段上有一个唯一且正常的索引有多糟糕
- 当表纯粹是ID时,索引比数据大有多糟糕
在您的位置上,我要问的问题是:如此小的表的索引如何严重影响我的查询运行时?也许你做错了什么(我认为这个表可能有很多冗余的查询),因为只有这么少的条目,一个查询不应该在这个时间范围内。)我不明白重复索引是什么意思。表中有三个索引:
例如,有一个唯一的('user_id')和一个键('user_id')(我甚至不确定MySQL是否允许这样做),因为一个索引将包含另一个索引,而没有任何好处 我相信,如果您将自己的唯一索引创建为(
user\u id
,date\u expired
,foreign\u id
),您将获得与唯一索引相同的好处,即在user\u id
上有一个普通索引。MySQL可以使用任何索引的第一列来减少连接中的行数,方法与user\u id
上的索引相同
有关更多信息,请参阅
您是否在架构的其他地方引用了id
auto\u increment列以节省空间?因为您的唯一索引覆盖了表中的所有其他列,所以它本质上是一个主键,如果您不这样做,它可能会被删除
您可以通过在查询前加上EXPLAIN来检查查询使用的键。太好了,我不知道!!这就是我所需要做的。我有一个主键,因为我使用的基本用户数据库管理系统要求我有一个主键。你是对的,我并不真的需要它,但它只是让我的生活更轻松,我怀疑它对速度有多大影响。酷,PostgreSQL也有类似的功能。我这么说是因为有人可能会像我一样怀疑这是否是一个常见的地方:-)查询中有20个表。这是一个最大的区别时,删除。