在看《高性能mysql》中的高性能索引策略中有一个地方不明
之前已经了解了 "选择性" 的概念, 知道选择性一般是加 前缀索引的时候,用来选合适的前缀长度的, 也知道前缀索引的算法是: 某个列在某个前缀下的所有不同值数量/记录总数
前面说的是“列的前缀”, 但下面这个多列索引, 怎么还有“前缀列”? 前缀列和列前缀一样?????都有选择性?
什么叫 "只使用了索引部分前缀列的查询来说选择性也更高" ?
首先我看不到断句在哪里? 是‘索引部分’的前缀列? 还是索引的‘部分前缀列’?
这里怎么扯到选择性的?
而且下面, 为什么customer_id的数量小了, 就排前面了?? 完全没看出怎么就选择性大了
而且后面还有个地方也很模糊:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
列的前缀是说对于内容很长的列,必须使用前缀索引,否则索引将会变得很大(或者 MySQL 压根就不允许索引这些列的完整长度)
前缀列是说建了(A,B,C,D)的索引,A 或者 A,B 或者 A,B,C 都叫做前缀列
如果你的 D 列选择性并不高(也就是不同的记录数占总记录数的比值不高),但是你只使用到了 A,B,C 那么选择性也是很高的
应该断句为 索引 的 部分的前缀列
上一节是多列索引,然后引出了你列出的本节————选择合适的索引列顺序,再结合上上一节的索引选择性,作者试图给你分析在使用“多列索引”的情况下,如何提高“索引的选择性”。
首先作者分别筛选了 staff_id=2和customer_id=584的情况,customer_id 筛选出的结果集很少,这也就说明选择性更高,这句话你如果不理解怎么引出的,上一段你标红那里的下一句就是“然而,性能不只是依赖于所有索引列的选择性(整体基数),也和查询条件的具体值有关,也就是和值的整体分布有关”
同样的数据量,某一列的不同值越多,说明选择性越好,就是说这列的这个值筛选后的结果集/行数最少,就叫选择性好。
同样的前缀索引选择尽量接近总行数也是为了这一列的同一个前缀值获取到的行数最少,就是更精确的定位行。
复合/多列索引一般要求把选择性好的列放前面,就像说(a,b,c)中的a,a就可以叫这个索引的前缀列,理解意思就行,不用那么纠结。
索引是 (a,b,c) 查询是a,b,d 是可以使用到索引的,但是只是用索引前面的 a,b列,如果查询是 b,c,d,就无法使用索引了。
而且为什么后面使用customer_id作为条件来筛选staff_id,看到此时staff_id的基数是17
那么为什么没有用staff_id作为条件看看customer_id的基数呢?
总之就是没看出来第一个无条件的sql在统计出各列的基数后, 为什么customer_id的基数少就说选择性好, 基数好也可能不同值的数量只有1个, 甚至值全相等, 那选择性可能最差吧