Mysql关于多列分离索引的问题

标签 mysql sql database indexing

如果你能根据你的经验帮助我回答这些问题

1-如果我为 5 列创建了单独的索引

用户名、国家/地区、创建时间、评论、状态

并在 where 子句 username=''、country = '' 和 comments = '' 中使用了许多列

sql 会对这 3 列使用索引吗?因为每个都有自己的索引。

2-如果我有多列索引“用户名,国家/地区,created_at,评论,状态”

我使用了 2 列,其中 username = '' 和 status = ''

我知道它会使用用户名,但它也会使用索引来获取状态吗?

最佳答案

MySQL 几乎从不在单个查询中使用 2 个索引。 (也就是说,优化器几乎从不选择“索引合并”。)

在适当的情况下,“复合”(多列)索引比两个单独的索引更好。

WHERE username = '...' and country = '...' and comment = '...'

通常会受益

INDEX(username, country, comments) -- in any order

为此WHERE , INDEX(username, country, created_at, comment, status)将仅使用前两列。 (除非它是“覆盖”。)

WHERE username = '' and status = ''

将从开始两者 username 开始的任何索引中受益和status任一顺序。它将部分受益于上面的 5 列复合索引 - 第一列 username 。它将使用 status仅当“覆盖”时。

“覆盖”索引是包含 SELECT任何地方使用的所有列的索引。询问。在 INDEX 中以正确的顺序排列正确的列比“覆盖”更重要。

这是my discussion关于如何创建最佳索引。

关于Mysql关于多列分离索引的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50254747/

相关文章:

MySQL - "select"速度

SQL Server : Combine several SELECT statements with "WITH" part into a UNION

php - 主机 (iPage) 不允许远程访问。那么我怎样才能访问/编辑我的数据库呢?

javascript - 错误: Unrecognized data type for field classMethods

sql - 如何在 SQL 查询中获得某些记录没有值的列

mysql - 慢速查询来计算标签数

php - PDO 预处理语句返回空数组

Mysql 查询从逻辑有缺陷的表问题中获取免费汽车

mysql - 带有外键的大型数据集的 Django 批量创建

php - 如何在 SQL 表中显示上次事件的在线/离线状态