- 联合索引
第一个字段>符号不走索引.
覆盖索引
in or 数据量。
取决于表记录
a like 'li%' b = 1 c = m
等值查询就会做调整与优化,这里走name字段过滤数据,得到的b 和 c是无序的。 无法很好的利用索引。
5.6 前需要回表才能解决.
5.6 之后下推到存储引擎层.
但也不是绝对的,数据量小的时候才会走索引,大的时候不一定会走索引下推.
trace工具
打开后查询,可以可看到扫描的行数,cpu和io成本.
order by: 索引
Using index 扫描索引本身完成排序,index效率高,filesort效率低.
order by 最左前缀。
group by xxx order by null.
where 优先级高于Having,在where层做过滤
比如name = 'zhuge' order pos.
-
单路排序:
通过name = xxx 找到主键id.
根据id然后取出来所有数据,再根据name做查找;
单路取出来所有数据。 -
双路排序:
取 id 和 pos2个字段的所有数据到sort buffer.
然后通过name = 'zhuge' 找主键id,
双路取出来id,然后过滤查找符合条件的.
索引设计原则:
- 代码先上,开发的差不多了再完善索引
- 联合索引覆盖条件
- 最左前缀,离散度大的条件区分
- 长索引可以指定列长,比如name 255,此时仅需要前20的索引长度. index(name(20),age,positioin).
- 设置联合的辅助索引
但是也不是设置的越多越好,查询的年龄身高性别,受欢迎度等字段太多的时候不适合再追加索引。 可以再单独设置一个联合索引









网友评论