这是一个创建于 1937 天前的主题,其中的信息可能已经有所发展或是发生改变。
大家觉得这个问题有没有毛病?我看过一些 mysql 的数据,但是涉及 sql 解析器,优化器的部分感觉都很理论且笼统,对于 mysql 是如何选择出索引的问题上确实没有思路。大家分析分析这个题
第 1 条附言 · 2019-06-10 15:06:32 +08:00
在不考虑临时表和排序的情况下,优化器的目的是通过选择合适索引找到扫描数据行数最少的方案。
扫描行多少涉及到索引“基数”,mysql 采样统计“基数”,采样的数据不够精准,导致最终选出的方案在优化器看来最优,但实际执行起来并不是最优。
所以可以理解为 mysql 优化器最终选择哪个索引,需要具体采样数据来决定的,我们并不能看出来或者算出来。
我觉得这道题隐藏的考察点可能是如何让 mysql 每次都能选择我们为某个 sql 所设计的最优索引,而不会因为优化器选择其他索引导致性能问题,
通过 force index 指定索引。
8 条回复 • 2019-06-10 17:31:06 +08:00
|
|
1
acehow 2019-06-10 14:44:30 +08:00 via Android 1
explain
|
|
|
2
snappyone 2019-06-10 14:45:52 +08:00
数据抽样做预测
|
|
|
3
wuxi889 2019-06-10 14:49:18 +08:00
感觉是考你每种索引的特点吧
|
|
|
4
clifftts 2019-06-10 15:09:20 +08:00
@ wuxi889 考察每种索引的特点,应该问如何针为 sql 设计一个最优索引吧
|
|
|
6
snappyone 2019-06-10 15:19:12 +08:00
@ clifftts force index 本身侵入性太强了,可以考虑低峰期 analyze 下 table
|
|
|
7
liprais 2019-06-10 15:30:36 +08:00 via iPad
mysql 连直方图都没有基数估计跟算命差不多准
|
|
|
8
Raymon111111 2019-06-10 17:31:06 +08:00
简单讲是通过算 cost
会选 cost 小的那个
换句话说会选区分度大的那个
|