天天日夜夜添_精品国产99久久久久久人裸体 _成人app在线观看_日韩色网站

新聞資訊

    本文由讀者小平同志投稿索引可以避免全表掃描,小平是一位非常樸實認真的猿,現于某上市證券公司做微服務開發,對 MySQL 優化有深入研究,小平的博客地址是。

    MySQL的索引對查詢速度的提高非常明顯,但是索引種類很多,如復合索引、單列索引,那它們有什么區別和聯系呢?下面我會對兩者進行分析。

    關鍵字準備工作

    先來準備一張表和一點測試數據:

    1. CREATE TABLE `user` (

    2. `id` int(11) NOT NULL AUTO_INCREMENT,

    3. `age` int(4) DEFAULT NULL,

    4. `name` varchar(20) DEFAULT NULL,

    5. `sex` int(3) DEFAULT NULL,

    6. `nickname` varchar(30) DEFAULT NULL,

    7. PRIMARY KEY (`id`),

    8. KEY `testKey` (`name`,`age`,`nickname`)

    9. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;


    10. INSERT INTO `user` VALUES ('1', '20', 'test1', '1', 'ntest1');

    11. INSERT INTO `user` VALUES ('2', '21', 'test2', '0', 'ntest2');

    12. INSERT INTO `user` VALUES ('3', '24', 'test1', '1', 'ntest3');

    13. INSERT INTO `user` VALUES ('4', '23', 'test4', '0', 'ntest4');

    14. INSERT INTO `user` VALUES ('5', '24', 'test5', '1', 'ntest5');

    15. INSERT INTO `user` VALUES ('6', '25', 'test6', '0', 'ntest6');

    單表復合索引

    mysql表索引_oracle索引掃描_索引可以避免全表掃描

    通過上面表格,我們會發現索引可以避免全表掃描,復合索引( name, age, )和它們三列的單個索引是有區別的(該案例不做復合索引和單列索引的性能分析)主要區別有以下幾點:

    復合索引中,只有最左邊的一列單獨使用才會觸發索引,其他的列單個使用無法觸發索引。

    復合索引中,從最左邊開始,相連的兩個或多個會觸發索引(相連和不相連的性能不同),如果沒有最左邊的列,后面的無論是否相連都不會觸發索引。

    通過分析我們可以發現,幾個列的復合索引,就相當于 有幾個索引,如復合索引(name,age,)相當于name索引、(name,age)索引以及(name,age,) 索引(注意,后面兩個索引不能再按復合索引算,只是為了解釋說明)。

    where 條件后面的順序不影響復合索引的觸發如age=='test1'一樣會觸發復合索引(MySQL會對查詢條件順序進行優化,我們無需擔心順序問題,但是為了更好理解,建議合理安排順序)。

    單表復合索引的性能分析

    mysql表索引_索引可以避免全表掃描_oracle索引掃描

    上面表格中,第一行和第二行都走了索引,但是第一行是相連的兩列,rows是1,這里我們可以說是使用了( name, age)索引(該索引并發真實存在,只是為了區分效果);第二行是不相連的兩列rows是2,然后第四行是使用了復合索引的第一列 name 和非復合索引中的列作為查詢條件,rows 同樣是2,非相連的兩列作為查詢條件時,復合索引相當于使用了第一列作為查詢條件。

    為什么會這樣呢?MySQL 在進行查詢時,會根據索引篩選出復合索引的行,如果存在查詢條件不在索引中的列,會進行二次篩選(即根據篩選出來的行進行二次查詢),導致遍歷的行數增加。

    部分查詢條件會導致全表掃描

    特殊注意:

    索引可以避免全表掃描_oracle索引掃描_mysql表索引

    使用MySQL的函數拼接條件一樣會使用索引。

    在使用 in 時,如果只有一個值,則等價于使用 =符號,會觸發索引,包含兩個或多個值,則索引失效。

    在使用 not in 時,無論多少個值,索引都會失效。

    使用 null 關鍵字查詢時,無論值是否有為空的,都會觸發索引。

    在使用 like 關鍵字時,只要使用了%號進行模糊匹配,就會使索引失效。

    網上說使用 is null 會使索引失效,我測試的結果是,使用 is null ,無論是復合索引還是單列索引都能觸發索引。

    索引可以避免全表掃描_oracle索引掃描_mysql表索引

    總結

    在我們使用單列索引和復合索引時,需要注意以下幾點:

    常用的字段放在第一列,經常和第一列一起使用的字段放在第二列,如用戶表的電話和姓名,身份證表的身份照號和姓名,如果超過兩列,則注意其順序。

    條件查詢時,盡可能所有字段都有索引(如sex這種情況例外,因為sex的值只有三個,冗余性太高,定位比較差,不如全表檢索快),這樣能提高很多效率。

    查詢時避免會使索引失效的情況發生,如or條件,可以使用union或者union all來達到相同效果。

    索引能提高查詢效率,但是過多的索引,同樣會降低我們的修改操作效率,對此,我們創建索引需要合理,在使用頻率較低的情況下,盡量不要創建索引。

    索引可以避免全表掃描_oracle索引掃描_mysql表索引

    *或許性能和指定字段相差不是非常大,但是代碼的可讀性降低了很多,不推薦使用。

    關注牧碼小子,后臺回復 Java ,領取松哥為你精心準備的Java干貨!

    往期文章一覽

    你點的每個在看,我都認真當成了喜歡

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有