濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 記一次MySQL的優(yōu)化案例

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

熱門標(biāo)簽:廣東人工電話機(jī)器人 芒果電話機(jī)器人自動(dòng)化 石家莊電商外呼系統(tǒng) 日照旅游地圖標(biāo)注 百度地圖圖標(biāo)標(biāo)注中心 南通自動(dòng)外呼系統(tǒng)軟件 信陽(yáng)穩(wěn)定外呼系統(tǒng)運(yùn)營(yíng)商 申請(qǐng)外呼電話線路 湖南人工外呼系統(tǒng)多少錢

一  背景

      有贊的每個(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)文章!

您可能感興趣的文章:
  • 淺談MySQL大表優(yōu)化方案
  • MySQL group by語(yǔ)句如何優(yōu)化
  • 解決mysql 組合AND和OR帶來(lái)的問(wèn)題

標(biāo)簽:沈陽(yáng) 天津 公主嶺 惠州 呼和浩特 阿里 合肥 牡丹江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《記一次MySQL的優(yōu)化案例》,本文關(guān)鍵詞  記,一次,MySQL,的,優(yōu)化,案例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《記一次MySQL的優(yōu)化案例》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于記一次MySQL的優(yōu)化案例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    三门峡市| 惠来县| 天门市| 隆德县| 宽城| 同心县| 临城县| 莆田市| 城固县| 咸丰县| 麻阳| 大足县| 阳泉市| 湛江市| 台东市| 德化县| 岚皋县| 若羌县| 绥芬河市| 佛冈县| 西贡区| 沙河市| 将乐县| 浦城县| 湘潭市| 清镇市| 江川县| 营山县| 修武县| 定陶县| 光泽县| 舟曲县| 嘉兴市| 香港 | 晋中市| 广丰县| 临颍县| 格尔木市| 平阳县| 禹城市| 孝昌县|