最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

記一次MySQL的優(yōu)化案例

 更新時(shí)間:2020年10月27日 14:41:48   作者:yangyidba  
這篇文章主要介紹了記一次MySQL的優(yōu)化案例,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下

一  背景

      有贊的每個(gè)OLTP數(shù)據(jù)庫(kù)實(shí)例上會(huì)設(shè)置一個(gè)sql-killer進(jìn)程用于kill 掉執(zhí)行時(shí)間超過(guò)一定閾值的sql。下午開(kāi)發(fā)接收到sql被kill的報(bào)錯(cuò),一起幫助開(kāi)發(fā)排查,本文介紹該案例。

二 場(chǎng)景分析

表結(jié)構(gòu):

CREATE TABLE `xxx_info` (

  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',

  `user_id` bigint(20) unsigned NOT NULL DEFAULT '0' ,

  `group_id` bigint(20) unsigned NOT NULL DEFAULT '0',

  `nick_name` varchar(30) NOT NULL DEFAULT '' COMMENT '昵稱',

  `is_del` tinyint(5) NOT NULL DEFAULT '0' COMMENT '0:數(shù)據(jù)有效、1:數(shù)據(jù)邏輯刪除',

  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',

  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時(shí)間',

  PRIMARY KEY (`id`),

  KEY `idx_userid_groupid` (`user_id`,`group_id`)

) ENGINE=InnoDB AUTO_INCREMENT=1382032 DEFAULT CHARSET=utf8mb4 ;

問(wèn)題sql如下

 SELECT id, name,status FROM xxx_info WHERE user_id IN (670039223,'373149878') AND group_id = 1 AND is_del = 0;

第一眼看到sql ,先檢查了表結(jié)構(gòu) 和索引 user_id 是數(shù)值類型的,且索引ok 然后手工執(zhí)行計(jì)劃竟然沒(méi)有走idx_userid_groupid索引,

懷疑 user_id in 兩種不同類型的字段導(dǎo)致"隱式轉(zhuǎn)換",將 其中參數(shù)值都換為數(shù)值類型或者字符串 或者使用 user_id=數(shù)值類型 or user_id=字符串,再次執(zhí)行

執(zhí)行計(jì)劃都是正確。對(duì)此我們要解決兩個(gè)問(wèn)題 

那么為啥當(dāng)user_id in (X,Y,Z) 是不同類型時(shí),就不走索引了呢?

我們使用optimizer_trace 來(lái)跟蹤執(zhí)行計(jì)劃。

set session optimizer_trace='enabled=on';

SELECT id, nick_name,is_del  FROM xxx_info WHERE user_id IN (670039223,'373149878') AND group_id = 1 AND is_del = 0;

select * from information_schema.optimizer_trace;

SELECT id, nick_name,is_del FROM xxx_info WHERE user_id IN (670039223,'373149878') AND group_id = 1 AND is_del = 0;

select * from information_schema.optimizer_trace;

set session optimizer_trace='enabled=off';

獲取兩個(gè)sql的執(zhí)行計(jì)劃并對(duì)比,結(jié)果顯示 

看到結(jié)果我表示

翻閱 https://bugs.mysql.com 還沒(méi)找到相關(guān)結(jié)果。

代碼里面如何產(chǎn)生不同類型的值?

以下是開(kāi)發(fā)(阿杜)自己的測(cè)試 

目前的解決方式是和開(kāi)發(fā)同學(xué)溝通讓他們?cè)诔绦蜃鰠?shù)類型一致性校驗(yàn),都轉(zhuǎn)換為 int/long 類型。

特別提醒常見(jiàn)發(fā)生隱式轉(zhuǎn)換導(dǎo)致索引失效的場(chǎng)景

1  where 判斷符號(hào)左邊是字符串 ,右邊是數(shù)值 比如

    where  name = 123

2  多表join關(guān)聯(lián)條件的字段類型不一致,類似于 1

3  多表join關(guān)聯(lián)條件字符集類型不一樣。比如

     a 表 order_no 是utf8mb4 ,b 表order_no 是 utf8 

感興趣的 朋友可以多測(cè)試,有其他案例的 歡迎討論。

以上就是記一次MySQL的優(yōu)化案例的詳細(xì)內(nèi)容,更多關(guān)于MySQL優(yōu)化案例的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mysql InnoDB和MyISAM區(qū)別原理解析

    Mysql InnoDB和MyISAM區(qū)別原理解析

    這篇文章主要介紹了Mysql InnoDB和MyISAM區(qū)別原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • mysql數(shù)據(jù)庫(kù)密碼忘記解決方法

    mysql數(shù)據(jù)庫(kù)密碼忘記解決方法

    大家好,本篇文章主要講的是mysql數(shù)據(jù)庫(kù)密碼忘記解決方法,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Ubuntu Server 16.04下mysql8.0安裝配置圖文教程

    Ubuntu Server 16.04下mysql8.0安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了Ubuntu Server 16.04下mysql8.0安裝配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Windows下通過(guò)DOS命令登錄MYSQL的方法

    Windows下通過(guò)DOS命令登錄MYSQL的方法

    這篇文章主要介紹了Windows下通過(guò)DOS命令登錄MYSQL的方法,方法很簡(jiǎn)單,本文給出了詳細(xì)操作步驟,需要的朋友可以參考下
    2015-05-05
  • MySQL中g(shù)roup by與max()一起使用的坑

    MySQL中g(shù)roup by與max()一起使用的坑

    最近在做一個(gè)項(xiàng)目,發(fā)現(xiàn)用之前SQL語(yǔ)句導(dǎo)出的余額與客戶人員最近消費(fèi)記錄所顯示的余額不一致,本文就來(lái)了解一下這個(gè)錯(cuò)誤,感興趣的可以了解一下
    2023-08-08
  • Ubuntu16.04 server下配置MySQL,并開(kāi)啟遠(yuǎn)程連接的方法

    Ubuntu16.04 server下配置MySQL,并開(kāi)啟遠(yuǎn)程連接的方法

    這篇文章主要介紹了Ubuntu16.04 server下配置MySQL,并開(kāi)啟遠(yuǎn)程連接的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2017-01-01
  • MySQL?使用觸發(fā)器記錄用戶的操作日志問(wèn)題

    MySQL?使用觸發(fā)器記錄用戶的操作日志問(wèn)題

    使用?MySQL?觸發(fā)器可以記錄哪些用戶、什么時(shí)間對(duì)數(shù)據(jù)表進(jìn)行了增、刪、改操作。如果執(zhí)行刪除操作,則記錄刪除之前的數(shù)據(jù)記錄;如果執(zhí)行更新操作,記錄更新之前的數(shù)據(jù)記錄,這篇文章主要介紹了MySQL?使用觸發(fā)器記錄用戶的操作日志,需要的朋友可以參考下
    2022-12-12
  • MySQL中substr函數(shù)使用方法實(shí)例詳解

    MySQL中substr函數(shù)使用方法實(shí)例詳解

    MySQL的SUBSTR()函數(shù)可以用于從指定字符串的指定位置開(kāi)始提取指定長(zhǎng)度的字符,下面這篇文章主要給大家介紹了關(guān)于MySQL中substr函數(shù)使用方法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • mysql 5.6.24 安裝配置方法圖文教程

    mysql 5.6.24 安裝配置方法圖文教程

    這篇文章主要為大家分享了mysql 5.7.14安裝配置方法圖文教程,感興趣的朋友可以參考一下
    2016-08-08
  • mysql索引失效的五種情況分析

    mysql索引失效的五種情況分析

    這篇文章主要介紹了mysql索引失效的5種情況分析,需要的朋友可以參考下
    2015-01-01

最新評(píng)論

治多县| 易门县| 晋宁县| 黄山市| 石狮市| 莱州市| 忻城县| 得荣县| 库车县| 白银市| 无极县| 锡林浩特市| 信阳市| 巩义市| 七台河市| 伊通| 长武县| 平塘县| 宁明县| 石楼县| 德阳市| 应城市| 遂昌县| 都江堰市| 怀化市| 虹口区| 大竹县| 娄底市| 台湾省| 辰溪县| 商南县| 定陶县| 华亭县| 日照市| 喀什市| 吴桥县| 平度市| 喀喇| 土默特右旗| 开化县| 江永县|