偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

 [[276045]]

概述

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

索引問題

1、無索引

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

2、隱式轉(zhuǎn)換

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

無索引實(shí)例

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

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

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

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

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

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

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

可以看到mo字段的過濾性是非常高的,進(jìn)一步驗(yàn)證可以通過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ù)庫常見的索引問題--無索引,隱式轉(zhuǎn)換,附實(shí)例說明

 

隱式轉(zhuǎn)換

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

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

執(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ù)庫常見的索引問題--無索引,隱式轉(zhuǎn)換,附實(shí)例說明

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

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

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

總結(jié)

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

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

 

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

2010-07-19 09:40:59

SQL Server數(shù)

2010-05-26 13:42:08

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

2023-11-16 17:12:33

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

2010-05-12 11:14:25

MySQL SQL優(yōu)化

2021-11-01 23:57:03

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

2009-04-22 14:19:32

Oracle中文索引基礎(chǔ)

2011-03-16 08:54:45

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

2021-12-23 10:54:35

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

2011-07-28 16:16:27

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

2018-06-26 15:58:06

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

2011-03-31 13:51:54

MySQL索引

2019-11-29 07:37:44

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

2011-04-07 16:43:23

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

2021-11-30 21:10:19

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

2017-02-08 11:00:50

數(shù)據(jù)庫索引類型

2010-05-31 12:10:37

2010-05-21 10:01:11

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

2011-07-18 15:59:17

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

2021-03-27 11:05:24

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

2021-04-09 08:21:25

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

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