日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

oracle查询两列合并成一列_MySQL复合索引和单列索引的单表查询分析

發布時間:2025/3/21 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle查询两列合并成一列_MySQL复合索引和单列索引的单表查询分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文由讀者小平同志投稿,小平是一位非常樸實認真的猿,現于某上市證券公司做微服務開發,對 MySQL 優化有深入研究,小平的博客地址是https://blog.csdn.net/weixin_41193109。

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

關鍵字

  • explain:MySQL查看執行計劃的關鍵字,放在sql語句之前。

  • type:訪問類型,表示找到所查詢數據的方法,常見的有ref、range、index、all等。

  • keys:索引類型,表示MySQL此次查詢中使用的索引,多個用逗號分開。

  • rows:遍歷行數,表示MySQL此次查詢遍歷的行數大小,該值越小,查詢速度會越快,是一個估計值,非絕對正確的。

準備工作

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

CREATE TABLE `user` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`age` int(4) DEFAULT NULL,

`name` varchar(20) DEFAULT NULL,

`sex` int(3) DEFAULT NULL,

`nickname` varchar(30) DEFAULT NULL,

PRIMARY KEY (`id`),

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

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

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

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

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

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

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

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

單表復合索引

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

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

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

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

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

  • 單表復合索引的性能分析

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

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

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

    特殊注意:

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

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

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

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

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

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

  • 總結

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

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

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

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

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

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

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

    往期文章一覽

    1、工作之余,你是怎么提高技術的?

    2、兩年了,我寫了這些干貨!

    3、想和大家談一點合作

    4、一個Java程序猿眼中的前后端分離以及Vue.js入門

    5、跟著平臺混了四年,現在要單飛了!

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

    總結

    以上是生活随笔為你收集整理的oracle查询两列合并成一列_MySQL复合索引和单列索引的单表查询分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。