|
|
|
@ -184,3 +184,62 @@ MySQL 通过查询优化器去判断用什么索引,或者全表扫描
|
|
|
|
|
当 where子句中只有 等于 或者 in条件的时候会命中自建hash
|
|
|
|
|
|
|
|
|
|
如果查询到 hash search少,non_hash search/s比较高,则可以关闭自适应hash。
|
|
|
|
|
|
|
|
|
|
## 高性能索引创建策略
|
|
|
|
|
|
|
|
|
|
- 索引列的类型尽量小
|
|
|
|
|
- 索引列的选择:(索引的选择性/离散性)不重复的索引值和【总数(n)】的比值越高则查询效率越高( 1/n ~ 1 )
|
|
|
|
|
|
|
|
|
|
可以这样查询:select count(distinct name)/count(*) from person; --查询name列的离散度,最佳为1,最差为1/n
|
|
|
|
|
|
|
|
|
|
- 前缀索引:针对blob,text很长的varchar字段,mysql不支持他们的全部长度,需要建立前缀索引。
|
|
|
|
|
|
|
|
|
|
创建前缀键/索引语法:alter table tableName add key/index (column(X))
|
|
|
|
|
|
|
|
|
|
前缀索引选择(X)X为截取的前X个字符:
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
select count(DISTINCT LEFT(order_note,1))/COUNT(*), ... ,count(DISTINCT LEFT(order_note,k))/COUNT(*),COUNT(distinct order_note)/COUNT(*) FROM order_exp;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
缺点:无法应用于order by 和 group by ,也无法做覆盖索引
|
|
|
|
|
|
|
|
|
|
- 后缀索引:mysql不支持后缀索引。
|
|
|
|
|
|
|
|
|
|
可以通过在表中添加一个新列,用于保存要被建立后缀索引的字段的倒排值,然后建立前缀索引
|
|
|
|
|
|
|
|
|
|
场景:查询邮箱后缀
|
|
|
|
|
|
|
|
|
|
- 只为搜索、排序或者分组的列创建索引
|
|
|
|
|
|
|
|
|
|
- 多列索引
|
|
|
|
|
|
|
|
|
|
将选择性最高(离散度)的列放到索引的最前列
|
|
|
|
|
|
|
|
|
|
根据那些运行频率最高的查询来调整索引列的顺序
|
|
|
|
|
|
|
|
|
|
优化性能时,【需要使用相同的列但顺序不同的索引】来满足不同类型的查询 需求 如index(name,age,sex) 和 index(age,name,sex)
|
|
|
|
|
|
|
|
|
|
## 三星索引
|
|
|
|
|
|
|
|
|
|
对于一个查询而言,三星索引可能是最好的索引
|
|
|
|
|
|
|
|
|
|
满足的条件如下:
|
|
|
|
|
|
|
|
|
|
- 索引将相关的记录放到了一起则获得第一颗星 缩小范围 这颗星的分值27分
|
|
|
|
|
- 如果索引中的数据顺序和查找中的排列顺序一致则获得第二颗星(排序星) 无需再排序 这颗星的分值23分
|
|
|
|
|
- 如果索引中的列包含了查询中需要的全部列则获得第三颗星(宽索引星) 无需回表 这颗星的分值50分
|
|
|
|
|
|
|
|
|
|
## mysql调优金字塔
|
|
|
|
|
|
|
|
|
|
- 硬件和OS(性价比低)
|
|
|
|
|
|
|
|
|
|
- MYSQL调优(性价比中等)
|
|
|
|
|
|
|
|
|
|
索引优化、熟悉业务、在阿里内部2/3的DBA是业务DBA
|
|
|
|
|
|
|
|
|
|
- 架构调优(性价比高)
|
|
|
|
|
|
|
|
|
|
系统设计:数据不合适:es、MQ、redis、读写分离、安全
|