自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解MySQL數(shù)據(jù)庫(kù)常見(jiàn)的索引問(wèn)題:無(wú)索引,隱式轉(zhuǎn)換,附實(shí)例說(shuō)明

數(shù)據(jù)庫(kù) MySQL
在這些年的工作之中,由于SQL問(wèn)題導(dǎo)致的數(shù)據(jù)庫(kù)故障層出不窮,而索引問(wèn)題是SQL問(wèn)題中出現(xiàn)頻率最高的,常見(jiàn)的索引問(wèn)題包括:無(wú)索引,隱式轉(zhuǎn)換。

 [[276045]]

概述

在這些年的工作之中,由于SQL問(wèn)題導(dǎo)致的數(shù)據(jù)庫(kù)故障層出不窮,而索引問(wèn)題是SQL問(wèn)題中出現(xiàn)頻率最高的,常見(jiàn)的索引問(wèn)題包括:無(wú)索引,隱式轉(zhuǎn)換。

索引問(wèn)題

1、無(wú)索引

當(dāng)數(shù)據(jù)庫(kù)中出現(xiàn)訪問(wèn)表的SQL無(wú)索引導(dǎo)致全表掃描,如果表的數(shù)據(jù)量很大,掃描大量的數(shù)據(jù),應(yīng)用請(qǐng)求變慢占用數(shù)據(jù)庫(kù)連接,連接堆積很快達(dá)到數(shù)據(jù)庫(kù)的最大連接數(shù)設(shè)置,新的應(yīng)用請(qǐng)求將會(huì)被拒絕導(dǎo)致故障發(fā)生。

2、隱式轉(zhuǎn)換

隱式轉(zhuǎn)換是指SQL查詢(xún)條件中的傳入值與對(duì)應(yīng)字段的數(shù)據(jù)定義不一致導(dǎo)致索引無(wú)法使用。常見(jiàn)隱士轉(zhuǎn)換如字段的表結(jié)構(gòu)定義為字符類(lèi)型,但SQL傳入值為數(shù)字;或者是字段定義collation為區(qū)分大小寫(xiě),在多表關(guān)聯(lián)的場(chǎng)景下,其表的關(guān)聯(lián)字段大小寫(xiě)敏感定義各不相同。隱式轉(zhuǎn)換會(huì)導(dǎo)致索引無(wú)法使用,進(jìn)而出現(xiàn)上述慢SQL堆積數(shù)據(jù)庫(kù)連接數(shù)跑滿(mǎn)的情況。

無(wú)索引實(shí)例

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

詳解mysql數(shù)據(jù)庫(kù)常見(jiàn)的索引問(wèn)題--無(wú)索引,隱式轉(zhuǎn)換,附實(shí)例說(shuō)明

執(zhí)行計(jì)劃:

詳解mysql數(shù)據(jù)庫(kù)常見(jiàn)的索引問(wèn)題--無(wú)索引,隱式轉(zhuǎn)換,附實(shí)例說(shuō)明

從上面的SQL看到執(zhí)行計(jì)劃中ALL,代表了這條SQL執(zhí)行計(jì)劃是全表掃描,每次執(zhí)行需要掃描707250行數(shù)據(jù),這是非常消耗性能的,該如何進(jìn)行優(yōu)化?添加索引。

驗(yàn)證mo字段的過(guò)濾性:

詳解mysql數(shù)據(jù)庫(kù)常見(jiàn)的索引問(wèn)題--無(wú)索引,隱式轉(zhuǎn)換,附實(shí)例說(shuō)明

可以看到mo字段的過(guò)濾性是非常高的,進(jìn)一步驗(yàn)證可以通過(guò)select count(*) as all_count,count(distinct mo) as distinct_cnt from user,通對(duì)比 all_count和distinct_cnt這兩個(gè)值進(jìn)行對(duì)比,如果all_cnt和distinct_cnt相差甚多,則在mo字段上添加索引是非常有效的。

添加索引

  1. mysql> alter table user add index ind_mo(mo); 
  2. mysql>SELECT uid FROM `userWHERE mo=13772556391 LIMIT 0,1; 

執(zhí)行計(jì)劃:

詳解mysql數(shù)據(jù)庫(kù)常見(jiàn)的索引問(wèn)題--無(wú)索引,隱式轉(zhuǎn)換,附實(shí)例說(shuō)明

 

隱式轉(zhuǎn)換

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

詳解mysql數(shù)據(jù)庫(kù)常見(jiàn)的索引問(wèn)題--無(wú)索引,隱式轉(zhuǎn)換,附實(shí)例說(shuō)明

執(zhí)行計(jì)劃:

  1. mysql> explain extended select uid from`userwhere mo=13772556391 limit 0,1; 
  2. mysql> show warnings; 
  3. Warning1:Cannot use index 'ind_mo' due to type or collation conversion on field 'mo'  
  4. Note:select `user`.`uid` AS `uid` from `userwhere (`user`.`mo` = 13772556391) limit 0,1 

如何解決:

詳解mysql數(shù)據(jù)庫(kù)常見(jiàn)的索引問(wèn)題--無(wú)索引,隱式轉(zhuǎn)換,附實(shí)例說(shuō)明

上述案例中由于表結(jié)構(gòu)定義mo字段后字符串?dāng)?shù)據(jù)類(lèi)型,而應(yīng)用傳入的則是數(shù)字,進(jìn)而導(dǎo)致了隱式轉(zhuǎn)換,索引無(wú)法使用,所以有兩種方案:

第一,將表結(jié)構(gòu)mo修改為數(shù)字?jǐn)?shù)據(jù)類(lèi)型。

第二,修改應(yīng)用將應(yīng)用中傳入的字符類(lèi)型改為數(shù)據(jù)類(lèi)型。

總結(jié)

在使用索引時(shí),我們可以通過(guò)explain+extended查看SQL的執(zhí)行計(jì)劃,判斷是否使用了索引以及發(fā)生了隱式轉(zhuǎn)換。

由于常見(jiàn)的隱式轉(zhuǎn)換是由字段數(shù)據(jù)類(lèi)型以及collation定義不當(dāng)導(dǎo)致,因此我們?cè)谠O(shè)計(jì)開(kāi)發(fā)階段,要避免數(shù)據(jù)庫(kù)字段定義,避免出現(xiàn)隱式轉(zhuǎn)換。

 

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2010-07-19 09:40:59

SQL Server數(shù)

2010-05-26 13:42:08

MySQL數(shù)據(jù)庫(kù)索引

2023-11-16 17:12:33

數(shù)據(jù)庫(kù)oracle

2010-05-12 11:14:25

MySQL SQL優(yōu)化

2009-04-22 14:19:32

Oracle中文索引基礎(chǔ)

2021-11-01 23:57:03

數(shù)據(jù)庫(kù)哈希索引

2018-06-26 15:58:06

數(shù)據(jù)庫(kù)MySQL索引優(yōu)化

2011-03-16 08:54:45

Oracle數(shù)據(jù)庫(kù)索引

2021-12-23 10:54:35

數(shù)據(jù)庫(kù)索引技術(shù)

2011-03-31 13:51:54

MySQL索引

2011-07-28 16:16:27

MySQL數(shù)據(jù)庫(kù)索引ORDER BY

2019-11-29 07:37:44

Oracle數(shù)據(jù)庫(kù)索引

2010-05-31 12:10:37

2017-02-08 11:00:50

數(shù)據(jù)庫(kù)索引類(lèi)型

2021-11-30 21:10:19

數(shù)據(jù)庫(kù)B樹(shù)索引

2011-04-07 16:43:23

MySQL數(shù)據(jù)庫(kù)

2010-05-21 10:01:11

MySQL數(shù)據(jù)庫(kù)

2011-07-18 15:59:17

MySQL數(shù)據(jù)庫(kù)

2021-03-27 11:05:24

數(shù)據(jù)庫(kù)索引MySQL

2021-04-09 08:21:25

數(shù)據(jù)庫(kù)索引數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)