欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

mysql索引怎么失效 mysql 索引失效

Mysql高級(五) 索引失效

1.全值匹配

專注于為中小企業(yè)提供成都網(wǎng)站建設、網(wǎng)站設計服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)棗強免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

2.最佳左前綴法則

3.不在索引列上做任何操作(計算、函數(shù)、(自動or手動)類型轉(zhuǎn)換),會導致索引失效而轉(zhuǎn)向全表掃描

4.存儲引擎不能使用索引中范圍條件右邊的列

5.盡量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一直)),減少select *

6.mysql在使用不等于(!=或者)的時候無法使用索引會導致全表掃描

7.is null, is not null也無法使用索引

8.like以通配符開頭(‘%abc...’)mysql索引失效會變成全表掃描的操作

9.字符串不加單引號索引失效

10.少用or,用它來連接時索引會失效

Mysql索引失效的底層原理

1.索引失效的原因

聯(lián)合索引排序的原理:先對第一個字段進行排序,在第一個字段相同的情況下考慮第二個字段,然后在第二個字段相同的情況下才考慮第三個字段...

CREATE TABLE 'test_user'(

'id' int(11) not null auto_increment comment '主鍵id',

‘user_id’ varchar(36) not null comment '用戶id',

'phone' varchar(20) not null comment '用戶名稱',

'lan_id' int(9) not null comment '本地網(wǎng)',

'region_id' int(9) not null comment '區(qū)域'

)ENGINE=InnoDB Auto_increment=4057960 Default charset=utf8mb4;

假設將('phone', 'lan_id', 'region_id')組成的聯(lián)合索引

Explain select * from test_user where lan_id = 1;

此時的索引是失效的,因為聯(lián)合索引是遵循最左前綴法則即第一個字段有序的情況下lan_id才有序?,F(xiàn)在是跳過phone,直接搜索lan_id相當于在一個無序的B+樹上搜索,所以只能全表掃描。

例1下例范圍查找的右邊索引會失效

Explain select * from test_user where a 1 and b = 1;

為什么索引會失效?

因為我們可以找到a 1的所有的節(jié)點,但是此時的b索引是無序的,仍然不可以通過二分查找法來查找

例2. like查詢中,如果%放在兩邊或者放到左邊,它都是不走索引的。只有%放到右邊,它某些情況才會走這個索引。這是什么原因?

字符串在B+樹里面存儲的時候,它也是按照字母的大小去排序。首先按照第一個字母去比較,如果第一個字母相同則按照第二個字母去比較和最佳左前綴法則相似。如果左邊用了%,那后面的字符是無序的,此時就不能使用二分查找來定位元素還是退化為了全表掃描。

3.Mysql中的索引查詢?yōu)槭裁词褂昧薆+樹結(jié)構(gòu),而不使用哈希索引或者B樹?

首先哈希值是無序的,不能夠進行范圍查找。

平衡二叉樹的缺點是當數(shù)據(jù)量非常大的時候,其深度也會非常深這樣也會導致查找效率慢。其次其存在回旋查找的問題。比如說當存在范圍查詢5的時候定位到該元素之后還得回溯到前面的節(jié)點元素6,7

B樹的最大特點是一個節(jié)點可以存儲多個值,這樣可以使得樹的高度變矮,從而使得樹的查找速度變快。但是其也存在回旋查找的問題。

B+樹則解決了這個問題,它的非葉子節(jié)點存儲的是key,其葉子節(jié)點既存儲了key也存儲了value并且其葉子節(jié)點是有序的,節(jié)點之間用指針相連也正是因為這一點使得B+樹在范圍查詢的時候不存在回旋問題。

為什么MySQL字符串不加引號索引會失效?這個答案是我見過最靠譜

作為一名程序員,在求職面試時,不知你有沒有遇到類似這樣的問題。

張工是一名java程序員,最近到一家軟件公司應聘軟件開發(fā)崗位,面試官問了他關于MySql索引這樣的一個問題。

對于這個問題張工之前在做項目時也曾遇到,那時候字段明明是加了索引,可不明白為什么還是很慢。后加上引號就正常了,為了趕項目進度,張工也沒有再去留意。

現(xiàn)在面試官突然這么一問,張工也說不出個所以然來。

面試官讓他回去等通知。

我們知道MySql索引可以加快數(shù)據(jù)檢索速度,這也是使用的索引的最主要原因。但有時候使用不當就會遇到索引失效問題,譬如在MySQL字符串類型查詢時不加引號索引會失效,是因為MySQL內(nèi)部進行了隱式轉(zhuǎn)換。

那為什么會發(fā)生隱式轉(zhuǎn)換?又是怎么轉(zhuǎn)換的呢?

今天我們來聊聊關于MySql索引失效的話題。

先來看看一般導致索引失效的有哪些?

如果一張表的索引有多個,要遵守最佳左前綴法則,即查詢從索引的最左前列開始并且不跳過索引中的列。

用戶表tb_user字段 id,name,age,sex

創(chuàng)建索引為idx_user_name

執(zhí)行語句:

這時候就會導致索引失效

在索引列上做加工操作,查詢時會導致索引失效,從而導致全表掃描。所以,建議不要在索引列上做任何操作。

舉個例子,例如訂單表tb_order有個索引是dt(日期), 字段數(shù)據(jù)存放的格式是這樣的2021-12-10 這樣的,如果有個需求需要根據(jù)dt,格式是20220207這樣的來查詢,這時候就不要對dt進行格式轉(zhuǎn)換了,

這樣索引就失效了。

而是應該對 20220207做格式處理

這樣dt索引才不會失效。

例如我們在訂單表tb_order建立了索引idx_order_id,order_id字段類型為varchar

在查詢時如果使用where order_id= 20220207123654100,這樣的查詢方式會直接造成索引失效。

要讓索引生效,正確的用法為

假如有張用戶表tb_user,創(chuàng)建的索引為idx_user_name_age_sex_phone 其中name、age、sex都加了索引。

執(zhí)行語句

上面這條sql語句只會命中name和age索引,sex索引會失效,復合索引失效需要查看key_len的長度。

再來看一個例子:

從這兩條SQL執(zhí)行的結(jié)果我們可以看出,執(zhí)行第一條SQL沒有使用到索引,而執(zhí)行第二條SQL時使用到了索引。這是為什么呢?

我們需要先了解下mysql索引優(yōu)化器工作的原理。選擇索引是優(yōu)化器工作,優(yōu)化器工作有自己的一套規(guī)則,如果等號兩邊的數(shù)據(jù)類型不一致,則會發(fā)生隱式轉(zhuǎn)換。

基于這條規(guī)則,我們回過頭看看

這條SQL語句執(zhí)行時就會變?yōu)?/p>

由于對索引列進行了函數(shù)操作,所以才導致索引失效,從而全表掃描了。

那么問題來了,細心的你不知有沒有留意到為什么是把左側(cè)的列轉(zhuǎn)為int類型,而不是把右側(cè)的值轉(zhuǎn)成字符串類型呢?

什么情況下把數(shù)字轉(zhuǎn)為字符串,什么情況下把字符串轉(zhuǎn)為數(shù)字,優(yōu)化器它是根據(jù)什么規(guī)則來進行判斷的?其實規(guī)則也并不復雜。

根據(jù)這個規(guī)則,我們再回過頭看看之前的查詢語句

select '12345678936' = 12345678936

返回1 所以這時候就把左側(cè)的列值12345678936轉(zhuǎn)成數(shù)字。

關于MySql索引失效的問題先簡單寫到這,建議平時在做項目時還是要多了解下原理,如果你了解其背后的原理,求職面試時和面試官交流起來就會很舒服了,相信能為這次面試加分,提高被錄用的概率。

為什么MySQL字符串類型查詢時不加引號索引會失效?這是因為要查詢的字符串字段沒有加引號時,MySQL內(nèi)部進行了隱式轉(zhuǎn)換,此次查詢會導致全表掃描,所以慢了。

總結(jié):

在索引列上進行了函數(shù)操作,MySQL內(nèi)部會進行了隱式轉(zhuǎn)換,導致索引失效,從而產(chǎn)生全表掃描。

由于筆者知識及水平有限,文中錯漏之處在所難免,如有不足之處,歡迎交流。

拓展

索引創(chuàng)建

1、主鍵索引:

2、唯一索引:

3、普通索引:

4、全文索引:

alter table table_name add fulltext (column)

5、聯(lián)合索引:

索引刪除

mysql為啥建選不了普通索引

mysql數(shù)據(jù)庫索引是一種能夠讓mysql數(shù)據(jù)查詢更加快速的數(shù)據(jù)結(jié)構(gòu),我們在新建數(shù)據(jù)庫的時候,如果設置了某個字段的Primary key主鍵,那么數(shù)據(jù)庫會默認為我們的主鍵字段創(chuàng)建一個唯一索引(Unique Index)的東西,所以你就不需要再為此字段創(chuàng)建mysql數(shù)據(jù)庫索引了,當然了,如果你想設置別的字段索引,那么就要額外加入該字段的數(shù)據(jù)庫索引了。

一:Mysql數(shù)據(jù)庫索引的創(chuàng)建

1)如何為我們的mysql數(shù)據(jù)庫添加索引呢?很簡單,請看下面的創(chuàng)建mysql普通索引格式:

CREATE INDEX [index name] ON [table name]([column name]);

參數(shù)說明:NameDescription

index name索引名稱.

table name需要添加索引的表名稱.

column name需要添加索引的列名稱.

例如我們要創(chuàng)建一個索引,就可以使用如下的mysql命令運行即可:CREATE INDEX myindex ON mytable(aut_id);

2)唯一索引的創(chuàng)建,和mysql普通索引差不多,只需要在INDEX關鍵詞前面加入UNIQUE關鍵詞即可,mysql命令如下:CREATE UNIQUE INDEX myindex ON mytable(aut_id);

我們也可以使用USING BTREE關鍵字,B-tree算法減少定位記錄時所經(jīng)歷的中間過程,從而加快存取速度,mysql命令如下:CREATE UNIQUE INDEX myindex ON mytable(aut_id) USING BTREE;

二:查看mysql數(shù)據(jù)庫索引

我們可以使用以下命令查詢剛剛新建的mysql數(shù)據(jù)庫索引,“from mytable”代表查詢該數(shù)據(jù)庫表里面有哪些索引,mysql命令如下:show index from mytable;

創(chuàng)建成功之后,會在“key_name”字段中顯示剛剛創(chuàng)建的數(shù)據(jù)庫索引名稱,如圖所示:

三:刪除mysql數(shù)據(jù)庫索引

我們也可以使用mysql命令刪除某張表的索引,命令如下:drop index english on mytable

四:查詢sql語句是否使用了mysql索引

我們上面常見好mysql數(shù)據(jù)庫索引之后,如果想要知道我們在執(zhí)行sql語句時是否使用了數(shù)據(jù)庫索引,就要在sql語句前面加入“EXPLAIN”關鍵詞,命令如下所示:EXPLAIN SELECT * FROM `allword` where english='America';

如果使用到了我們創(chuàng)建的字段索引,就會看到如圖所示的字段都不會是NULL空值,如下:

在有些情況下mysql索引會失效,也就是在執(zhí)行到sql語句時沒有使用到我們創(chuàng)建的數(shù)據(jù)庫表字段索引,可能有以下這些情況:

1:使用了OR關鍵字查詢

2:或者LOWER(),UPPER()函數(shù),

3:還有一種就是使用了LIKE關鍵字查詢,像(like '%XX'或者like '%XX%')這樣的語句,但是像(like 'XX%')這種情況的mysql表索引是不會失效的。

mysql 索引失效總結(jié)

首先我們還是先把表結(jié)構(gòu)說下:用戶表tb_user結(jié)構(gòu)如下:

1、 不要在索引列上進行運算操作, 索引將失效。

手機號phone字段有唯一索引,當根據(jù)phone字段進行函數(shù)運算操作之后,索引失效:

2、 字符串類型字段使用時,不加引號,索引將失效。

如果字符串不加單引號,對于查詢結(jié)果,沒什么影響,但是數(shù) 據(jù)庫存在隱式類型轉(zhuǎn)換,索引將失效。

3、 如果僅僅是尾部模糊匹配,索引不會失效。如果是頭部模糊匹配,索引失效。

接下來,我們來看一下這三條SQL語句的執(zhí)行效果,查看一下其執(zhí)行計劃:

由于下面查詢語句中,都是根據(jù)profession(專業(yè))字段查詢,profession字段是一個普通的索引, 我們主要看一下,模糊查詢時,%加在關鍵字之前,和加在關鍵字之后的影響。

經(jīng)過上述的測試,我們發(fā)現(xiàn),在like模糊查詢中,在關鍵字后面加%,索引可以生效。而如果在關鍵字 前面加了%,索引將會失效。

4、 用or分割開的條件, 如果or前的條件中的列有索引,而后面的列中沒有索引,那么涉及的索引都不會 被用到。

由于age沒有索引,所以即使id有索引,索引也會失效。所以需要針對于age也要建立索引。

5、 數(shù)據(jù)分布影響:如果MySQL評估使用索引比全表更慢,則不使用索引。

當前題目:mysql索引怎么失效 mysql 索引失效
路徑分享:http://chinadenli.net/article26/dodcdcg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航、商城網(wǎng)站Google、外貿(mào)網(wǎng)站建設域名注冊、營銷型網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設