mysql优化篇(基于索引)

我们也知道mysql的优化可以从很多的方面进行 , 比如硬件 , 换个ssd的磁盘也很爽 , 环境的搭建 , 比如读写分离等 , 参数的配置 , 表结构的设计 , 字段类型的合理选用 , sql的正确书写方式 , 索引的构建等 , 这里我们主要从sql的查询做优化 , 主要是基于走索引的方式去学习 。
一、优化能够带来什么优化能带来的肯定是爽!!!当你作为一个用户去体验某个网页正在加载中 。。。 内心肯定是崩溃的 , 秒出的网页肯定是爽 。 做开发测试的是每次查询几分钟甚至十几分钟 , 内心不会崩溃 , 只想砸电脑 , 所以速度快就是爽 。 速度快了 , 用户爽了 , 你公司爽了 , 你老板爽了 , 你也就爽了 , 薪资说不定也爽了 。 上面我们提到了优化可以从很多个方面进行:最常见的就是sql和索引的优化了 , 因为写CURD的小伙伴都免不了写个查询语句 , 然后语句走不走索引呢 , 这也会决定你爽不爽了 , 这种层次的优化相对成本低 , 效果好 , 主要还是根据业务场景来 , 不像msyql环境 , 配置啊等 , 因为会有很多个业务呀 , 不可能让环境是合适所有的业务场景吧 , 顶多有个合理居中值 。 (瞎扯 , 编不下去了 。。。 不过确实能带来爽和成就感)
回到顶部
二、优化思路既然要做优化 , 首先要知道哪些需要优化吧 , 然后做分析这个sql慢是因为什么 , 然后才是怎么解决呢 , 在实际的环境中可能先要定位慢的语句 , 然后观察一段时间是不是一直都慢呢 , 还是有时候慢有时候又很快呢 , 这些都和实际环境中的并发 , msyql环境当时的健康程度有关吧 , 所以要先锁定目标然后观察 , 然后把那些都慢的sql都弄出来进行分析 , 最后做优化 。 这里会说一下怎么找到慢的sql查询和分析 , 优化交给下一节 。
2.1、慢查询语句(mysqldumpslow)mysql中有很多的日志文件 , binlog日志 , 慢日志 , 查询日志 , 错误日志 。 这里我们要说的是慢日志 , 默认情况下是没有开始慢日志查询日志的 , 因为会影响一些些性能 。 (惨遭打脸 , 自己玩的竟突开启了)
show variables like '%slow_query_log%';
mysql优化篇(基于索引)文章插图
虽然是开启了慢日志查询的功能 , 还得要有个阈值判断执行多久是慢日志查询吧(默认10s): show variables like '%long_query_time%';
mysql优化篇(基于索引)文章插图
太长了 , 我们改改 , 10s一点都不爽;set global long_query_time=3;改完配置后记得重启session 。 来测试:
mysql优化篇(基于索引)文章插图
上图是弄了一个超过3s的执行语句 , 查看慢日志的文件 , 确实被记录在里头了 , 还包括了很多其他的值 , 比如时间 , 用户 , 主机 , 执行时间等 。
那如果这个慢日志的文件很大很大 , 很多的查询 , 不可能这么手动的去找吧 。 所有就要有慢日志的分析工具了:mysqldumpslow
mysql优化篇(基于索引)文章插图
[root@lgh mysql]# ./bin/mysqldumpslow --helpUsage: mysqldumpslow [ OPTS... ] [ LOGS... ]Parse and summarize the MySQL slow query log. Options are--verboseverbose--debugdebug--helpwrite this text to standard output-vverbose-ddebug-s ORDERwhat to sort by (al, at, ar, c, l, r, t), 'at' is default#按照某种方式排序 , 默认atal: average lock time #平均锁定时间ar: average rows sent #平均返回记录数at: average query time #平均查询时间c: count #访问次数l: lock time #锁定时间r: rows sent #返回记录t: query time #查询时间-rreverse the sort order (largest last instead of first) #倒序-t NUMjust show the top n queries#topN-adon't abstract all numbers to N and strings to 'S'-n NUMabstract numbers with at least n digits within names-g PATTERNgrep: only consider stmts that include this string#正则-h HOSTNAMEhostname of db server for *-slow.log filename (can be wildcard),default is '*', i.e. match all-i NAMEname of server instance (if using mysql.server startup script)-ldon't subtract lock time from total time #总时间(包括锁定时间)
mysql优化篇(基于索引)文章插图
./bin/mysqldumpslow -s t -t 3 /apps/mysql8/logs/mysql/slow3306.log
./bin/mysqldumpslow -s t -t 2 -r /apps/mysql8/logs/mysql/slow3306.log
mysql优化篇(基于索引)文章插图
用起来不是很难 , 当然还有很多其他的慢日志的一些工具 , 比如:mysqlsla , pt-query-digest等 , 这些都需要自己去安装的 。