Mysql性能分析過程

1. 數(shù)據(jù)準(zhǔn)備(單表演示)

  1. 創(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
    
  2. 初始化數(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. 剖析

  1. 查看、配置剖析配置
    select @@profiling;


    image.png

0代表未開啟

開啟剖析配置:set profiling = 1

針對(duì)select * from biz_article where title = '164OneBlog簡(jiǎn)介(未開啟評(píng)論' 這個(gè)SQL語句我們進(jìn)行分析

  1. 分析
    1. 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)生性能問題,

  2. 我們?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)化查詢,
  3. 添加唯一建
    alter table biz_article
    add constraint biz_title
    unique (title)
  4. 繼續(xù)分析,看是否生效
    重復(fù)上述步驟就好,可以


    image.png

    image.png

    得到顯著提升

索引失效情況

select * from biz_article where title like '%999999OneBlog簡(jiǎn)介(未開啟評(píng)論';
針對(duì)以上SQL分析


image.png
  1. image.png

    這里可能會(huì)有問題,我添加了索引,為什么沒有用到,這類需要注意的就是特殊情況索引失效問題,最左前綴原則
    這里流出常出現(xiàn)的情況


    image.png

3. 慢查詢

在工作中,我們不可能所以數(shù)據(jù)人工分析、記錄耗時(shí)問題,這里Mysq提供了慢查詢?nèi)罩?,作用就是記錄?zhí)行耗時(shí)超出預(yù)期的SQL語句,

  1. 查看、開啟慢查詢?nèi)罩?br> 查看: show variables like 'slow_query_log%'


    image.png

    slow_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


image.png

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容