系统运维系列 之MySQL联合索引的使用分析
Posted 琅晓琳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统运维系列 之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 INDEX
INDEX_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
以上是关于系统运维系列 之MySQL联合索引的使用分析的主要内容,如果未能解决你的问题,请参考以下文章