亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何優化MySQL

發布時間:2020-10-28 21:31:47 來源:億速云 閱讀:140 作者:Leah 欄目:開發技術

如何優化MySQL?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

一  背景

      有贊的每個OLTP數據庫實例上會設置一個sql-killer進程用于kill 掉執行時間超過一定閾值的sql。下午開發接收到sql被kill的報錯,一起幫助開發排查,本文介紹該案例。

二 場景分析

表結構:

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:數據有效、1:數據邏輯刪除',

  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',

  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',

  PRIMARY KEY (`id`),

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

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

問題sql如下

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

第一眼看到sql ,先檢查了表結構 和索引 user_id 是數值類型的,且索引ok 然后手工執行計劃竟然沒有走idx_userid_groupid索引,

如何優化MySQL

懷疑 user_id in 兩種不同類型的字段導致"隱式轉換",將 其中參數值都換為數值類型或者字符串 或者使用 user_id=數值類型 or user_id=字符串,再次執行

如何優化MySQL

如何優化MySQL

執行計劃都是正確。對此我們要解決兩個問題 

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

我們使用optimizer_trace 來跟蹤執行計劃。

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';

獲取兩個sql的執行計劃并對比,結果顯示 

如何優化MySQL

看到結果我表示

如何優化MySQL

翻閱 https://bugs.mysql.com 還沒找到相關結果。

代碼里面如何產生不同類型的值?

以下是開發(阿杜)自己的測試 

如何優化MySQL

目前的解決方式是和開發同學溝通讓他們在程序做參數類型一致性校驗,都轉換為 int/long 類型。

特別提醒常見發生隱式轉換導致索引失效的場景

1  where 判斷符號左邊是字符串 ,右邊是數值 比如

    where  name = 123

2  多表join關聯條件的字段類型不一致,類似于 1

3  多表join關聯條件字符集類型不一樣。比如

     a 表 order_no 是utf8mb4 ,b 表order_no 是 utf8 

看完上述內容,你們掌握如何優化MySQL的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双柏县| 南乐县| 曲水县| 景宁| 遂宁市| 沈丘县| 长泰县| 卢龙县| 镇平县| 哈密市| 若尔盖县| 宣威市| 钦州市| 县级市| 海盐县| 武平县| 南昌县| 葫芦岛市| 沭阳县| 离岛区| 安化县| 龙门县| 遂平县| 分宜县| 南通市| 通榆县| 大同市| 鄂温| 修文县| 博白县| 聂拉木县| 米易县| 扎兰屯市| 云林县| 莒南县| 穆棱市| 叶城县| 滨海县| 治多县| 佳木斯市| 自治县|