1. 數(shù)據(jù)準(zhǔn)備(單表演示)
- 創(chuàng)建表
CREATE TABLE `biz_article` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `title` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文章標(biāo)題', `user_id` bigint unsigned NOT NULL COMMENT '用戶ID', `cover_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文章封面圖片', `qrcode_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文章專屬二維碼地址', `is_markdown` tinyint unsigned DEFAULT '1', `content` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '文章內(nèi)容', `content_md` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT 'markdown版的文章內(nèi)容', `top` tinyint(1) DEFAULT '0' COMMENT '是否置頂', `type_id` bigint unsigned NOT NULL COMMENT '類型', `status` tinyint unsigned DEFAULT NULL COMMENT '狀態(tài)', `recommended` tinyint unsigned DEFAULT '0' COMMENT '是否推薦', `original` tinyint unsigned DEFAULT '1' COMMENT '是否原創(chuàng)', `description` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文章簡(jiǎn)介,最多200字', `keywords` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文章關(guān)鍵字,優(yōu)化搜索', `comment` tinyint unsigned DEFAULT '1' COMMENT '是否開啟評(píng)論', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加時(shí)間', `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新時(shí)間', PRIMARY KEY (`id`) USING BTREE, ) ENGINE=InnoDB AUTO_INCREMENT=6000001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPACT - 初始化數(shù)據(jù)(100w條數(shù)據(jù))
create definer = root@localhost procedure proc_initData() BEGIN DECLARE i INT DEFAULT 1; WHILE i<=1000000 DO INSERT INTO ralap_test.biz_article ( title, user_id, cover_image, qrcode_path, is_markdown, content, content_md, top, type_id, status, recommended, original, description, keywords, comment, create_time, update_time) VALUES (concat(i,'OneBlog簡(jiǎn)介(未開啟評(píng)論'), 1, 'zhyd/cover/20180613092017699.jpg', null, 1, '<h1 id="dblog-">OneBlog簡(jiǎn)介</h1> <p>OneBlog是一款簡(jiǎn)潔美觀、自適應(yīng)的Java博客系統(tǒng)。使用springboot開發(fā),前端使用Bootstrap。支持移動(dòng)端自適應(yīng),配有完備的前臺(tái)和后臺(tái)管理功能。</p> ', '# OneBlog簡(jiǎn)介 DBlog是一款簡(jiǎn)潔美觀、自適應(yīng)的Java博客系統(tǒng)。使用springboot開發(fā),前端使用Bootstrap。支持 移動(dòng)端自適應(yīng),配有完備的前臺(tái)和后臺(tái)管理功能。 ', 0, 3, 1, 0, 1, 'OneBlog是一款簡(jiǎn)潔美觀、自適應(yīng)的Java博客系統(tǒng)。使用springboot開發(fā),前端使用Bootstrap。支持移動(dòng)端自適應(yīng),配有完備的前臺(tái)和后臺(tái)管理功能。', 'OneBlog,開源博客', 0, '2021-02-20 11:54:21', '2021-02-20 11:54:21'); SET i = i+1; END WHILE; END;
2. 剖析
-
查看、配置剖析配置
select @@profiling;
image.png
0代表未開啟
開啟剖析配置:set profiling = 1
針對(duì)select * from biz_article where title = '164OneBlog簡(jiǎn)介(未開啟評(píng)論' 這個(gè)SQL語句我們進(jìn)行分析
- 分析
-
explain select * from biz_article where title = '164OneBlog簡(jiǎn)介(未開啟評(píng)論'
image.png
這里通過分析查詢處理的數(shù)據(jù)進(jìn)行分析, 這里是各個(gè)列的說明
image.png我們一般關(guān)心selec_type、type、key、ref、rows,這幾個(gè)字段,這里就詳細(xì)說明,具體可以看一些文章,都有詳細(xì)介紹,這里我們分析我們的SQL,看到我們type是ALL,說明SQL進(jìn)行了全表掃描,這樣數(shù)據(jù)量打的情況是會(huì)產(chǎn)生性能問題,
-
-
我們?cè)倏聪戮唧w的執(zhí)行耗時(shí)
show profiles;
image.png
我們關(guān)心的是Query_ID 為26的這條記錄,這里可以看出耗時(shí)1.1s,
然后再看下具體各個(gè)階段耗時(shí)情況
show profile for query 26
image.png
這里就是各個(gè)細(xì)節(jié)的耗時(shí),主要時(shí)間還是在executing上,也就是耗時(shí)主要在檢索數(shù)據(jù)本省
通過上述的分析,我們可以分析出主要的耗時(shí)問題,
這里我們可以通過分析,因?yàn)閠itle字段是惟一的,所以我們可以創(chuàng)建唯一索引,優(yōu)化查詢, - 添加唯一建
alter table biz_article
add constraint biz_title
unique (title) -
繼續(xù)分析,看是否生效
重復(fù)上述步驟就好,可以
image.png
image.png
得到顯著提升
索引失效情況
select * from biz_article where title like '%999999OneBlog簡(jiǎn)介(未開啟評(píng)論';
針對(duì)以上SQL分析

-
image.png
這里可能會(huì)有問題,我添加了索引,為什么沒有用到,這類需要注意的就是特殊情況索引失效問題,最左前綴原則
這里流出常出現(xiàn)的情況
image.png
3. 慢查詢
在工作中,我們不可能所以數(shù)據(jù)人工分析、記錄耗時(shí)問題,這里Mysq提供了慢查詢?nèi)罩?,作用就是記錄?zhí)行耗時(shí)超出預(yù)期的SQL語句,
-
查看、開啟慢查詢?nèi)罩?br> 查看: show variables like 'slow_query_log%'
image.pngslow_query_log:OFF未開啟,ON開啟
slow_query_log_file: 慢查詢?nèi)罩疚募恢?br> 查看耗時(shí)閾值:show variables like 'long_query_time',默認(rèn)是10s,意思是執(zhí)行時(shí)間超過10s的查詢,才會(huì)記錄到日志,
image.png
開啟慢查詢、調(diào)整閾值
>set slow_query_log = ON;
>set global long_query_time = 1;
設(shè)置后退出連接重連Mysql生效
然后執(zhí)行:select * from biz_article where title like '%999999OneBlog簡(jiǎn)介(未開啟評(píng)論';
查看日志文件:view /usr/local/var/mysql/MacBook-Pro-slow.log

看到慢查詢語句已經(jīng)在記錄中










