系统运维系列 之MySQL联合索引的使用分析

1 前言
日常优化中可能会遇到相同的数据在本地执行很快但是在服务器上执行很慢的问题,或者无论是在本地还是在服务器上都执行的很慢,可以分为两个方面排查

2 第一部分
本地执行速度 > 服务器执行速度
一般这种情况比较少见,服务器性能要好于本地电脑,当出现这种情况时可以按照以下步骤排查:
2.1 查看物理CPU个数和内核个数:
查看物理CPU个数:cat—>cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
查看服务器CPU内核个数:cat—>cat /proc/cpuinfo | grep "cpu cores" | uniq
2.2 查看服务器CPU使用率:
CPU占用率查看命令:top—>可以查看CPU占用百分率
内存占用率:free -m—>可以查看used、free等信息
使用vmstat命令
2.3 查询前10个最耗CPU时间的SQL语句:

SELECT TOP 10
dest.[text] AS 'sql语句'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id] > 50
ORDER BY [cpu_time] DESC

2.4 查询CPU占用高的语句:

SELECT TOP 10
total_worker_time / execution_count AS avg_cpu_cost,
plan_handle,
execution_count,
( SELECT SUBSTRING(text, statement_start_offset / 2 + 1,
( CASE WHEN statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), text))
* 2
ELSE statement_end_offset
END - statement_start_offset ) / 2)
FROM sys.dm_exec_sql_text(sql_handle)
) AS query_text
FROM sys.dm_exec_query_stats
ORDER BY [avg_cpu_cost] DESC

3 第二部分:
无论是在本地还是在服务器上都执行的很慢
思路:优化sql:
3.1 需要添加索引或者联合索引:
插入a、b、c联合索引—>ALTER TABLE ABC ADD INDEXINDEX_A_B_C(a,b,c) USING BTREE;
3.2 执行顺序:
最左原则,在检索数据时从联合索引的最左边开始匹配,类似于给(a,b,c)这三个字段加上联合索引就等于同时加上了 (a) (ab) (abc) 这三种组合的查询优化
需要避免索引失效的情况,如:LIKE %xxx,或者条件中使用函数等
3.3 MySQL的BTREE索引和HASH索引:
B-TREEB-TREE以B+树结构存储数据,大大加快了数据的查询速度,适用于全值匹配的查询SQL,如 where id= ‘123456’;覆盖索引的SQL查询,就是说select出来的字段都建立了索引
Hash索引基于Hash表实现,只有查询条件精确匹配Hash索引中的所有列才会用到hash索引,Hash不适用于区分度小的列上,如性别字段

4 参考资料:
https://www.cnblogs.com/mumuluo/p/13993223.html top命令查看服务器cpu使用情况等
https://blog.csdn.net/CMEguagua/article/details/105414085?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0.control&spm=1001.2101.3001.4242 Linux 查看服务器内存、CPU、网络等占用情况的命令–汇总
https://bbs.csdn.net/topics/391882795 相同的数据,在本地执行很快 服务器上执行很慢 是什么原因
https://blog.csdn.net/ScarletMeCarzy/article/details/109091115 USING BTREE 是什么意思 有什么作用 Mysql

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值