我的索引结构如下:
BTREE merchant_id
BTREE flag
BTREE test (merchant_id, flag)
我执行这样的 SELECT 查询:
SELECT badge_id, merchant_id, badge_title, badge_class
FROM badges WHERE merchant_id = 1 AND flag = 1
什么索引会更好?它们是否位于单独的索引中是否重要?
最佳答案
要回答诸如“哪一列最好建立索引?”和“查询规划器是否使用某个索引来执行查询?”之类的问题,您可以使用 EXPLAIN
statement 。参见优秀文章Analyzing Queries for Speed with EXPLAIN
全面概述如何使用 EXPLAIN
优化查询和架构。
一般来说,在可以通过对多个列之一建立索引来优化查询的情况下,一个有用的经验法则是对所有记录中“最唯一”或“最具选择性”的列建立索引;也就是说,对所有行中具有最多不同值的列进行索引。我猜测在您的情况下,merchant_id
列包含最多数量的唯一值,因此可能应该对其进行索引。您可以在所有变体的查询中使用 EXPLAIN
来验证索引选择是否最优。
请注意,经验法则“对最具选择性的列进行索引”并不一定适用于选择复合(也称为复合或多列)索引的第一列。这取决于您的查询。例如,如果 employee_id
是最具选择性的列,但您需要执行诸如 SELECT * FROM badages WHERE flag = 17
之类的查询,则将其作为表上的唯一索引badges
复合索引 (employee_id, flag)
表示查询结果是全表扫描。
关于mysql 与索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8872316/