99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

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

Mysql高級(五) 索引失效

1.全值匹配

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

2.最佳左前綴法則

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

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

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

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

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

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

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

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

Mysql索引失效的底層原理

1.索引失效的原因

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

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 '本地網',

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

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

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

Explain select * from test_user where lan_id = 1;

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

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

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

為什么索引會失效?

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

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

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

3.Mysql中的索引查詢為什么使用了B+樹結構,而不使用哈希索引或者B樹?

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

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

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

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

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

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

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

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

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

面試官讓他回去等通知。

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

那為什么會發生隱式轉換?又是怎么轉換的呢?

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

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

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

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

創建索引為idx_user_name

執行語句:

這時候就會導致索引失效

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

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

這樣索引就失效了。

而是應該對 20220207做格式處理

這樣dt索引才不會失效。

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

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

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

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

執行語句

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

再來看一個例子:

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

我們需要先了解下mysql索引優化器工作的原理。選擇索引是優化器工作,優化器工作有自己的一套規則,如果等號兩邊的數據類型不一致,則會發生隱式轉換。

基于這條規則,我們回過頭看看

這條SQL語句執行時就會變為

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

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

什么情況下把數字轉為字符串,什么情況下把字符串轉為數字,優化器它是根據什么規則來進行判斷的?其實規則也并不復雜。

根據這個規則,我們再回過頭看看之前的查詢語句

select '12345678936' = 12345678936

返回1 所以這時候就把左側的列值12345678936轉成數字。

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

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

總結:

在索引列上進行了函數操作,MySQL內部會進行了隱式轉換,導致索引失效,從而產生全表掃描。

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

拓展

索引創建

1、主鍵索引:

2、唯一索引:

3、普通索引:

4、全文索引:

alter table table_name add fulltext (column)

5、聯合索引:

索引刪除

mysql為啥建選不了普通索引

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

一:Mysql數據庫索引的創建

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

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

參數說明:NameDescription

index name索引名稱.

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

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

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

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

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

二:查看mysql數據庫索引

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

創建成功之后,會在“key_name”字段中顯示剛剛創建的數據庫索引名稱,如圖所示:

三:刪除mysql數據庫索引

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

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

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

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

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

1:使用了OR關鍵字查詢

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

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

mysql 索引失效總結

首先我們還是先把表結構說下:用戶表tb_user結構如下:

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

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

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

如果字符串不加單引號,對于查詢結果,沒什么影響,但是數 據庫存在隱式類型轉換,索引將失效。

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

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

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

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

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

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

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

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

成都網站建設公司_創新互聯,為您提供面包屑導航商城網站Google外貿網站建設域名注冊營銷型網站建設

廣告

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

成都定制網站建設