From 0a9f9536e857e36cf710fd87422d10ea49853b23 Mon Sep 17 00:00:00 2001 From: lixicai <1210922622@qq.com> Date: Sun, 2 Apr 2023 00:33:11 +0800 Subject: [PATCH] =?UTF-8?q?2023=E5=B9=B44=E6=9C=882=E6=97=A500:33:09?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MySQL性能调优与架构设计.md | 61 ++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/MySQL性能调优与架构设计.md b/MySQL性能调优与架构设计.md index ef1dea8..5c77792 100644 --- a/MySQL性能调优与架构设计.md +++ b/MySQL性能调优与架构设计.md @@ -183,4 +183,63 @@ MySQL 通过查询优化器去判断用什么索引,或者全表扫描 当 where子句中只有 等于 或者 in条件的时候会命中自建hash -如果查询到 hash search少,non_hash search/s比较高,则可以关闭自适应hash。 \ No newline at end of file +如果查询到 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、读写分离、安全 \ No newline at end of file