mysql 与索引

标签 mysql sql

我的索引结构如下:

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/

相关文章:

mysql - 使用 IN 子句进行条件检查 mysql

mysql - 如何连接到 mysql 并在 Jenkins 自由式作业中传递凭据

MySQL 表主/外键以使 id 跟随

sql - 带有两个参数的 Rails 查询在生产环境中不起作用 : Operator does not exist

sql - 创建没有文件名的数据库?

mysql - 如何在使用select查询时将mysql中的数字转换为字符

sql - 我想将行数分配给 "variable"

php - 对同一请求使用 mysql GROUP BY 和 ORDER BY

sql - 如何与多个 CTE 表进行 UNION?

java - 使用线程发出数据库请求