1
2
MySQL可以一次使用一个索引。对于这个查询,您需要一个涵盖搜索方面的复合索引。WHERE子句的常量方面应在范围方面之前使用,例如:
|
2
1
下面是优化器在查询中看到的内容。
正在检查是否将索引用于
对于一个
如果
启动
具有
假设你有
对于从中选择的每一行
如果
启动
具有
优化器将查看“statistics”,粗略地决定从哪个表开始。所以,添加我建议的所有索引。 “覆盖”索引包含 全部的 需要的列 在任何地方 在查询中。它是 有时 明智的做法是用更多的列扩展“好”索引,使其“覆盖”。
但这里有个活动扳手。
因此,对于
因为有一个
关于…的笔记
因为它隐藏了索引列,所以它不是起始列(
|
3
0
使用类似的黑客程序,您正在欺骗优化器,因此它使用不同的计划(最可能的做法是首先使用idx f7146f0aa9e377a索引)。 你应该能在解释中看到这一点。 我认为在您的案例中,真正的问题是第二行解释:服务器对6716行执行多个函数(月、年),然后尝试对所有这些行进行分组。在此期间,所有这些6716行都应存储(存储在内存中或基于服务器配置的磁盘上)。
=>我们讨论了多少行? 如果上面查询中的数字要低很多,那么6716我将尝试在customer_i d、company_i d、source和date列上添加覆盖索引。不确定最佳顺序,因为它取决于您拥有的数据(检查这些列的基数)。我从索引(日期、公司ID、来源、客户ID)开始。另外,我会在合作伙伴上添加唯一索引(i d,District_i d,Owner_i d)。 还可以添加其他生成的存储列(年份和月份)(如果服务器有点旧,可以添加普通列并用触发器填充它们)以消除多个函数执行。 |
hello_programmers · Mysql从其他表输出一列 1 年前 |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |
Popo · Sql查询:返回数据库中不可用的where条件 1 年前 |
Hamdan Nuramdani · 对账单中一周内不同表中的数据求和 1 年前 |
Kugelfisch · 用php为数据库加密数据 1 年前 |