2023年4月2日00:33:09

main
lixicai 3 years ago
parent e35ebb8ba5
commit 0a9f9536e8

@ -183,4 +183,63 @@ MySQL 通过查询优化器去判断用什么索引,或者全表扫描
当 where子句中只有 等于 或者 in条件的时候会命中自建hash 当 where子句中只有 等于 或者 in条件的时候会命中自建hash
如果查询到 hash search少non_hash search/s比较高则可以关闭自适应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))
前缀索引选择XX为截取的前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、读写分离、安全
Loading…
Cancel
Save