chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MySQL字符集不一致導(dǎo)致索引失效的案例分析

jf_78858299 ? 來(lái)源:阿Q說(shuō)代碼 ? 作者:不剪發(fā)的Tony老師 ? 2023-03-02 09:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

問(wèn)題描述

有個(gè)朋友給我發(fā)來(lái)一個(gè)問(wèn)題,說(shuō)是他們的系統(tǒng)有幾十萬(wàn)用戶(hù),某個(gè)查詢(xún)需要 5 秒以上的時(shí)間才能返回,同時(shí)服務(wù)器 CPU 資源占用率將近 100%。這個(gè)對(duì)于用戶(hù)的線上操作影響非常大,那么我們就來(lái)看看如何分析和解決這個(gè)慢查詢(xún)問(wèn)題。

為了便于說(shuō)明問(wèn)題,我們對(duì)表結(jié)構(gòu)進(jìn)行了簡(jiǎn)化:

create table customer(
  cid int auto_increment primary key,
  cname varchar(50) not null,
  register_time datetime not null,
  recommender varchar(50) character set utf8
) engine=innodb default charset=utf8mb4;

create unique index uk_customer_cname on customer(cname);

insert into customer(cname, register_time, recommender) values('張三', now(), '');
insert into customer(cname, register_time, recommender) values('李四', now(), '張三'),('王五', now(), '李四');
  • ? customer 是用戶(hù)表,其中 cid 是主鍵;
  • ? cname 上有一個(gè)唯一索引;
  • ? recommender 是用戶(hù)的推薦人。

實(shí)際查詢(xún)涉及了很多表,經(jīng)過(guò)簡(jiǎn)化之后存在性能問(wèn)題的語(yǔ)句如下:

select c.*
from customer c
join customer r on (c.recommender = r.cname )
where r.cid = 1
and c.register_time between now() - interval 1 day and now();

大意是查找通過(guò)某人推薦,在指定時(shí)間段內(nèi)注冊(cè)的用戶(hù)。

問(wèn)題分析

了解問(wèn)題之后,首先我讓他給我發(fā)來(lái)了 explain 執(zhí)行計(jì)劃:

explain
select c.*
from customer c
join customer r on (c.recommender = r.cname )
where r.cname = '張三'
and c.register_time between now() - interval 1 day and now();

id|select_type|table|partitions|type |possible_keys    |key              |key_len|ref  |rows|filtered|Extra      |
--|-----------|-----|----------|-----|-----------------|-----------------|-------|-----|----|--------|-----------|
 1|SIMPLE     |r    |          |const|uk_customer_cname|uk_customer_cname|202    |const|   1|   100.0|Using index|
 1|SIMPLE     |c    |          |ALL  |                 |                 |       |     |   3|   33.33|Using where|

從結(jié)果可以看出,有一個(gè)全表掃描(type = ALL)的操作,顯然這是因?yàn)?recommender 字段上缺少索引。

所以,我們首先為 recommender 字段創(chuàng)建了一個(gè)索引:

create index idx_customer_cname on customer(recommender);

之后再次查看了執(zhí)行計(jì)劃,結(jié)果沒(méi)有任何變化,創(chuàng)建的索引沒(méi)有生效。然后我們使用了 show warnings 命令看看有沒(méi)有更多的信息:

show warnings\\G
*************************** 1. row ***************************
  Level: Note
   Code: 1003
Message: /* select#1 */ select `hrdb`.`c`.`cid` AS `cid`,`hrdb`.`c`.`cname` AS `cname`,`hrdb`.`c`.`register_time` AS `register_time`,`hrdb`.`c`.`recommender` AS `recommender` from `hrdb`.`customer` `c` join `hrdb`.`customer` `r` where ((`hrdb`.`c`.`register_time` between

這里有一個(gè)問(wèn)題,就是存在字符集轉(zhuǎn)換:

convert(`hrdb`.`c`.`recommender` using utf8mb4) = '張三')

recommender 需要轉(zhuǎn)換為 utf8mb4 字符集,查看表結(jié)構(gòu)之后發(fā)現(xiàn)它的字符集是 utf8,和表中的其他字段字符集不一樣。原來(lái)他們是從之前的版本遷移過(guò)來(lái)的表結(jié)構(gòu),不知怎么會(huì)導(dǎo)致遺留一個(gè)字段的字符集忘記了調(diào)整。

MySQL 支持?jǐn)?shù)據(jù)庫(kù)、表以及字段級(jí)別的字符集(Character Set)和排序規(guī)則(Collation)。不同字符集支持的字符種類(lèi)和數(shù)量不同,例如 ASCII 字符集只能存儲(chǔ)字母、數(shù)字和常見(jiàn)的符號(hào),GB2312 和 GB18030 可以支持中文,Unicode 字符集能夠支持多國(guó)語(yǔ)言;排序規(guī)則定義了字符的排序順序,例如是否區(qū)分大小寫(xiě)、是否區(qū)分重音、中文按照拼音還是偏旁進(jìn)行排序等。

接下來(lái)就是修改字段的字符集了:

alter table customer modify column recommender varchar(50) character set utf8mb4;

然后,再次查看執(zhí)行計(jì)劃的結(jié)果如下:

id|select_type|table|partitions|type |possible_keys     |key               |key_len|ref  |rows|filtered|Extra      |
--|-----------|-----|----------|-----|------------------|------------------|-------|-----|----|--------|-----------|
 1|SIMPLE     |r    |          |const|uk_customer_cname |uk_customer_cname |202    |const|   1|   100.0|Using index|
 1|SIMPLE     |c    |          |ref  |idx_customer_cname|idx_customer_cname|203    |const|   1|   33.33|Using where|

在實(shí)際環(huán)境中優(yōu)化之后的查詢(xún)需要 0.1 秒左右,已經(jīng)完全可以滿(mǎn)足業(yè)務(wù)的需求了。

總結(jié)

本文分析了一個(gè)由于字符集不一致,導(dǎo)致增加了索引但是無(wú)法使用的案例。通過(guò)索引進(jìn)行查找時(shí)需要進(jìn)行數(shù)據(jù)的比較,字符集不一致時(shí)需要使用 convert 函數(shù)進(jìn)行轉(zhuǎn)換,從而導(dǎo)致索引失效。通常在遷移遺留系統(tǒng)時(shí)需要特別小心,對(duì)于 Unicode 推薦使用最新的 utf8mb4 字符集。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11070

    瀏覽量

    216819
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    9778

    瀏覽量

    87810
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    855

    瀏覽量

    27845
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    CAN總線采樣點(diǎn)不一致的危害

    , CAN協(xié)議規(guī)定,節(jié)點(diǎn)在檢測(cè)到過(guò)多錯(cuò)誤后會(huì)進(jìn)入錯(cuò)誤被動(dòng)狀態(tài)或總線關(guān)閉狀態(tài)。在總線關(guān)閉狀態(tài)下,節(jié)點(diǎn)停止參與通信,可能導(dǎo)致網(wǎng)絡(luò)部分或完全失效。采樣點(diǎn)不一致導(dǎo)致此類(lèi)狀態(tài)的常見(jiàn)原因之
    發(fā)表于 06-07 08:55

    AD9910初始相位不一致

    調(diào)試AD9910的DRG模式的時(shí)候,目前能出線性調(diào)頻信號(hào),但是會(huì)出現(xiàn)相位不一致,初始相位直在跳,因?yàn)镈RG模式可以選擇頻率、相位、幅度三個(gè)中個(gè)進(jìn)行控制,我目前是控制的頻率,請(qǐng)問(wèn)怎么能解決這個(gè)相位
    發(fā)表于 10-24 15:49

    字符集字符集編碼詳解

    字符集字符集編碼詳解
    發(fā)表于 09-12 08:33 ?4次下載
    <b class='flag-5'>字符集</b>與<b class='flag-5'>字符集</b>編碼詳解

    基于偏好不一致熵的偏好決策方法

    針對(duì)多規(guī)則有序決策系統(tǒng)中的偏好決策問(wèn)題,根據(jù)有序決策的偏好不一致特性,提出了種基于偏好不一致熵的偏好決策方法。首先,定義了樣本的偏好不一致熵( PIEO),用來(lái)度量特定樣本相對(duì)于樣本
    發(fā)表于 12-05 11:50 ?0次下載

    感興趣區(qū)域不一致性決策算法

    醫(yī)學(xué)影像感興趣區(qū)域( ROI)的噪聲和疾病誤判是個(gè)典型的不一致性決策問(wèn)題,同時(shí)也是困擾臨床診斷的個(gè)難題。針對(duì)這個(gè)問(wèn)題,基于宏觀與微觀結(jié)合、全局與局部相結(jié)合的思想,提出了基于一致度、
    發(fā)表于 01-02 18:43 ?0次下載

    分布式大數(shù)據(jù)不一致性檢測(cè)

    關(guān)系數(shù)據(jù)庫(kù)中可能存在數(shù)據(jù)不一致性現(xiàn)象,關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)質(zhì)量的個(gè)主要問(wèn)題是存在違反函數(shù)依賴(lài)情況,為找出不一致數(shù)據(jù)需要進(jìn)行函數(shù)依賴(lài)沖突檢測(cè).集中式數(shù)據(jù)庫(kù)中可以通過(guò)SQL技術(shù)檢測(cè)不一致情況,
    發(fā)表于 01-12 16:29 ?0次下載

    鋰電池組不一致性的原因及危害是怎樣的

    鋰電池組不一致性的原因及損害,看了就明白!鋰電池組電壓不一致會(huì)發(fā)生什么損害?怎么應(yīng)對(duì)鋰電池組不一致性的損害?鋰電池參數(shù)的不一致首要是指容量、內(nèi)阻、開(kāi)路電壓的
    發(fā)表于 03-17 17:39 ?1.2w次閱讀

    鋰電池組不一致性的原因是什么,它的危害有哪些

    鋰電池組不一致性的原因及損害,看了就明白!鋰電池組電壓不一致會(huì)發(fā)生什么損害?怎么應(yīng)對(duì)鋰電池組不一致性的損害?鋰電池參數(shù)的不一致首要是指容量、內(nèi)阻、開(kāi)路電壓的
    發(fā)表于 03-17 17:41 ?4887次閱讀

    什么是電芯的不一致性?電芯不一致會(huì)造成什么后果?

    這些電芯在容量、電壓、內(nèi)阻等方面存在差異的現(xiàn)象。 首先,容量不一致會(huì)導(dǎo)致電池組充電和放電不平衡。比如在充電過(guò)程中,容量大的電芯會(huì)充滿(mǎn)電后繼續(xù)接收充電,而容量小的電芯已經(jīng)充滿(mǎn)電,但仍在接收充電,造成了些電芯過(guò)
    的頭像 發(fā)表于 11-06 10:56 ?4791次閱讀

    什么是鋰離子電池不一致性?如何提高鋰離子電池的一致性?

    以及充放電速率和循環(huán)壽命的差異。鋰離子電池的不一致性主要由以下幾個(gè)方面的原因造成: 1. 材料差異:鋰離子電池的正負(fù)極材料存在制造差異,其中最常見(jiàn)的是鋰離子電池正極材料的顆粒大小和分布不均勻,導(dǎo)致充放電反應(yīng)不一致
    的頭像 發(fā)表于 11-10 14:49 ?2703次閱讀

    mysql主從復(fù)制數(shù)據(jù)不一致怎么辦

    不一致的原因和解決方法。 、MySQL主從復(fù)制數(shù)據(jù)不一致的原因 網(wǎng)絡(luò)延遲:主從之間的網(wǎng)絡(luò)延遲導(dǎo)致從庫(kù)在主庫(kù)執(zhí)行完并提交的操作之前拉取到的b
    的頭像 發(fā)表于 11-16 14:35 ?2832次閱讀

    mysql8.0默認(rèn)字符集是什么

    MySQL 8.0 默認(rèn)字符集是 utf8mb4。 MySQL 8.0 是當(dāng)前最新的開(kāi)源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由Oracle公司開(kāi)發(fā)和維護(hù)。MySQL 8.0 默認(rèn)
    的頭像 發(fā)表于 11-16 14:48 ?2243次閱讀

    導(dǎo)致MySQL索引失效的情況以及相應(yīng)的解決方法

    導(dǎo)致MySQL索引失效的情況以及相應(yīng)的解決方法? MySQL索引的目的是提高查詢(xún)效率,但有些情況
    的頭像 發(fā)表于 12-28 10:01 ?1112次閱讀

    電池電壓不一致串聯(lián)后會(huì)自己均衡嗎

    電池電壓不一致串聯(lián)后會(huì)自己均衡嗎 電池電壓不一致是指串聯(lián)連接的電池中,各個(gè)電池的電壓不完全相同。電池串聯(lián)起來(lái)的總電壓等于各個(gè)電池的電壓之和,但是電池串聯(lián)后,電流會(huì)在電池間流動(dòng),導(dǎo)致電池之間的電荷分布
    的頭像 發(fā)表于 01-19 10:32 ?1.3w次閱讀

    充放電不一致影響超級(jí)電容器性能的原因及解決方案

    等方面。本文將詳細(xì)探討充放電不一致的原因,并提出相應(yīng)的解決方案。 首先,充放電不一致的主要原因之是電解質(zhì)濃度不均勻。超級(jí)電容器中的電解質(zhì)起到傳導(dǎo)電荷的作用,而電解質(zhì)濃度的不均勻會(huì)導(dǎo)致
    的頭像 發(fā)表于 02-03 15:02 ?2929次閱讀