【发布时间】:2012-12-18 04:54:48
【问题描述】:
我经常在表posts 中搜索user+status 和user+time 列中的值。
SELECT * FROM `posts` WHERE `user`='xxx' and `status`='active'
SELECT * FROM `posts` WHERE `user`='xxx' and `time`>...
因此我设置了两个索引(用户,状态)和(用户,时间)
我知道,需要更新的索引越多,写入过程就越慢。但我认为在这种情况下,同时拥有两个索引很有用,因为读取操作的数量远远超过写入操作。
无论如何,PHPMyAdmin 会发出警告说“为列用户创建了多个索引”。我可以忽略这个警告吗?我检查了 Wordpress DB 表,发现它们已经在第二个位置放置了一列,如果它已经有索引的话。
comment_approved_date_gmt = INDEX(comment_approved, comment_date_gmt)
comment_date_gmt = INDEX(comment_date_gmt)
他们为什么不只使用一个两列索引 (INDEX(comment_date_gmt, comment_approved)),这样可以节省 INDEX(comment_date_gmt)?为什么有两个以相同列名开头的索引是不利的?
是否有一个通用规则,即在我的查询中应该首先显示哪一列?例如,不同条目数量最少的条目(例如状态),然后是不同值数量较多的条目(例如用户名)
【问题讨论】:
-
一般来说,人们希望尽可能快地到达所需的记录(即比较少),并且 MySQL 索引是按照其组成列的命名顺序构建的(左-向右)。因此,在所有其他条件相同的情况下,人们会希望列从高基数到低基数排序;也就是说,所有其他事情很少是平等的,人们通常希望优先考虑某些列以适合希望使用索引的查询。
-
您不需要将列名放在反引号中。
标签: mysql indexing query-optimization