gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

MySQL索引給拿捏住了

本篇文章給大家帶來了關于mysql的相關知識,其中主要介紹了關于mysql索引的相關問題,包括了索引按照邏輯功能劃分、按照物理實現劃分、按照字段個數劃分等索引類型問題,希望對大家有幫助。

MySQL索引給拿捏住了

推薦學習:mysql教程

在 SQL 優化中,索引是至關重要的一環,能給查詢效率帶來質的飛躍,但是索引并不是萬能的,不合理的索引設計甚至會拖慢查詢效率。

索引定義

索引是一種專門用于幫助 SQL 高效獲取數據的數據結構,一個常用的例子是,索引類似于一本書的目錄,可以快速對特定值進行定位和查找,從而大大加快數據查詢的效率。實際上,索引也是一張表,這張表保存了主鍵與索引字段,并指向實體表的記錄(類似指針)。

索引優缺點

優點

  • 索引大大減小了服務器需要掃描的數據量
  • 索引可以幫助服務器避免排序和臨時表
  • 索引可以將隨機IO變成順序IO
  • 索引對于InnoDB(對索引支持行級鎖)非常重要,InnoDB僅對需要訪問的元組加鎖,而索引能夠減少InnoDB訪問的元組數。如果查詢不能使用索引,MySQL會進行全表掃描,并鎖住每一個元組,不管是否真正需要。

缺點

  • 雖然索引大大提高了查詢速度,同時卻會降低更新表的速度。因為更新表時,MySQL不僅要保存數據,還要保存索引文件。因此,對應更新非常頻繁的字段,通常不建議使用索引。
  • 建立索引會占用磁盤空間。
  • 如果某個數據列包含許多重復的內容,為它建立索引效果就很差,這個性質稱為索引的選擇性:不重復的索引值和數據表中的記錄總數的比值。索引的選擇性越高則查詢效率越高。比如對性別字段建立索引,一百萬條數據,只有男女兩種可能,索引選擇性為五十萬分之一,索引效果就很差
  • 對于非常小的表,索引意義不大,大部分情況下簡單的全表掃描更高效。

因此應該只為最經常查詢和最經常排序的數據列建立索引。MySQL里同一個數據表里的索引總數限制為16個。

索引類型

按功能邏輯劃分

從功能邏輯來劃分,索引主要分為 普通索引、唯一索引、主鍵索引和全文索引

普通索引

最基本的索引,它沒有任何限制。普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對數據的訪問速度。因此,應該只為那些最經常出現在查詢條件(WHERE column = …)或排序條件(ORDER BY column)中的數據列創建索引。

普通索引的創建有三種方式。

# 創建索引CREATE INDEX idx_username ON user_tbl(username);# 對于字符串字段,可以手動指定長度,如 user_tbl(username(5)),表示只用前五個字符來做索引,可以進一步加快查詢效率,索引長度要小于字段長度# 修改表結構ALTER TABLE user_tbl ADD INDEX idx_username (username)# 創建表的時候直接指定,如CREATE TABLE user_tbl(  	ID INT NOT NULL,  	username VARCHAR(16) NOT NULL,  	INDEX idx_username (username) );

刪除索引

DROP INDEX idx_username ON user_tbl;

查看索引

SHOW INDEX FROM user_tbl;

唯一索引

它與前面的普通索引類似,不同的就是:普通索引允許被索引的數據列包含重復的值。而唯一索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。

唯一索引的創建跟普通索引類似:

#創建索引 CREATE UNIQUE INDEX idx_username ON user_tbl(username);  # 修改表結構 ALTER TABLE user_tbl ADD UNIQUE idx_username (username)  # 創建表的時候直接指定 CREATE TABLE user_tbl(  	ID INT NOT NULL,  	username VARCHAR(16) NOT NULL,  	UNIQUE idx_username (username)  );

主鍵索引

它是一種特殊的唯一索引,不允許有空值。一張表只能有一個主鍵,一般是在建表的時候同時創建。

CREATE TABLE user_tbl(  	ID INT NOT NULL,  	username VARCHAR(16) NOT NULL,  	PRIMARY KEY(ID)  );

與之類似的是外鍵索引,如果為某個外鍵字段定義了一個外鍵約束條件,MySQL就會定義一個內部索引來幫助自己以最有效率的方式去管理和使用外鍵約束條件。

全文索引

在上一篇文章 MySQL 基礎語法 中,我們說過如果使用了 LIKE + % 開頭,就索引會失效,那么當我們需要前后都模糊搜索的需求(如 LIKE ‘%hello%’),就需要使用全文索引,需要注意的是,Innodb 只有在 5.6 版本之后才支持全文索引。

全文索引的創建和刪除:

# 創建的兩種方法 CREATE FULLTEXT INDEX idx_name ON tbl_name(field_name); ALTER TABLE tbl_name ADD FULLTEXT INDEX idx_name(field_name);  # 刪除的兩種方法 DROP INDEX idx_name ON tbl_name; ALTER TABLE tbl_name DROP INDEX idx_name;

使用全文索引進行全模糊匹配的語法為:

SELECT XXX FROM tbl_name WHERE match(field_name) against('xxx'); # 比如對 user_tbl 的 user_name 字段加了全文索引 # 查詢結果等效于 SELECT user_name, user_id FROM user_tbl WHERE user_name LIKE '%hello%'; SELECT user_name, user_id FROM user_tbl WHERE match(user_name) against('hello');

使用 explain 檢查,可以發現 fulltext 索引生效。
MySQL索引給拿捏住了

按物理實現劃分

按物理實現方式來劃分,通常可以分為聚集索引和非聚集索引。

聚集索引(clustered index)

存儲內容是按照聚集索引排序的,聚集索引的順序和行記錄的順序一致,一張表只能有一個聚集索引。聚集索引的葉子節點直接儲存聚集索引指向的內容,因此查詢的時候只需要進行一次查找。

聚集索引在創建主鍵時自動生成,如果沒有主鍵,則根據第一個不為空的唯一索引自動生成,如果還沒有,則自動生成一個隱式的聚集索引。

需要注意的是,在進行查詢操作的時候,聚集索引的效率更高,因為少了一次查找;但是進行修改操作的時候,效率比非聚集索引低,因為直接修改了數據內容,為了標準數據內容的順序和聚集索引順序一致,會對數據頁重新排序。

非聚集索引(non-clustered index)

非聚集索引雖然索引項是順序存儲的,但是索引項對應的內容是隨機存儲的,系統會維護單獨的索引表來存儲索引。

非聚集索引的葉子節點存儲的是數據的地址,查詢非聚集索引的時候,系統會進行兩次查找,先查找索引,再查找索引對應位置的數據。因此非聚集索引也叫二級索引或者輔助索引。

按字段個數劃分

按字段個數可以把索引分為單一索引和聯合索引。

單一索引

索引字段只有一列時為單一索引,上述所有索引都是單一索引。

聯合索引

將多個字段組合在一起創建的索引叫聯合索引。如下:

ALTER TABLE user_tbl ADD INDEX idx_name_city_age (username,city,age);

最左匹配原則

建立這樣的聯合索引,其實是相當于分別建立了下面三組聯合索引:

usernname,city,age usernname,city usernname

為什么沒有 city,age 這樣的聯合索引呢?這是因為MySQL聯合索引的最左匹配原則,只會按照最左優先的順序進行索引匹配,也就是說,(x,y,z) 和 (z,y,x) 是不同的索引,即使是使用聯合索引中的字段查詢,聯合索引也有可能失效。

對于 (x,y,z),只有在以下查詢條件聯合索引會生效:

WHERE x = 1WHERE x = 1 AND y = 1WHERE x = 1 AND y = 1 AND z = 1

對于其他情況,比如 WHERE y = 1WHERE y = 1 AND z = 1 等,就不會匹配聯合索引,索引失效,注意對于 WHERE x = 1 AND z = 1,聯合索引會對 x 生效,但是對 z 不生效。

可以擴展了解一下,理論上最左匹配原則中索引對 where 中子句的順序也是敏感的,但是由于MySQL的查詢優化器會自動調整 where 子句的條件順序以使用適合的索引,所以實際上 where 子句順序不影響索引的效果。

要注意的是,如果聯合索引查詢過程中有范圍查詢,就會停止匹配,比如下面的語句中, z 字段不能使用到索引:

WHERE x = 1 AND y > 2 AND z = 3

順便提一下,可以用 explain 命令來查看在某個查詢語句中索引是否生效,具體用法請參考官網文檔。

如果分別在 x, y, z 上建立單列索引,讓該表有3個單列索引,索引效率也會大不一樣,在聯合索引生效的情況下,單個索引的效率遠遠低于聯合索引。這是由 MySQL 查詢優化器的執行順序決定的,在執行一條查詢 sql 時,針對索引的選擇大致有如下步驟:

  1. MySQL 優化器根據搜索條件,找出所有可能使用的索引
  2. 計算全表掃描的代價
  3. 計算使用不同索引執行查詢的代價
  4. 對比各種執行方案的代價,找出成本最低的那一個

因此,雖然有多個單列索引,但 MySQL 只能用到其中的那個系統認為似乎是最有效率的,其他的就會失效。

按索引結構劃分

不同的 mysql 數據引擎支持不同結構的索引,按結構劃分,常用的索引為 B+樹索引、Hash 索引、FULLTEXT索引 等,將在下一篇文章 MySQL 索引結構 中介紹。

使用總結

接下來我們來簡單總結一下在什么場景下推薦使用索引。

推薦使用

  • WHERE, GROUP BY, ORDER BY 子句中的字段

  • 多個單列索引在多條件查詢是只會有一個最優的索引生效,因此多條件查詢中最好創建聯合索引。

    聯合索引的時候必須滿足最左匹配原則,并且最好考慮到 sql 語句的執行順序,比如 WHERE a = 1 GROUP BY b ORDER BY c, 那么聯合索引應該設計為 (a,b,c),因為在上一篇文章 MySQL 基礎語法 中我們介紹過,mysql 查詢語句的執行順序 WHERE > GROUP BY > ORDER BY。

  • 多張表 JOIN 的時候,對表連接字段創建索引。

  • 當 SELECT 中有不在索引中的字段時,會先通過索引查詢出滿足條件的主鍵值,然后通過主鍵回表查詢出所有的 SELECT 中的字段,影響查詢效率。因此如果 SELECT 中的內容很少,為了避免回表,可以把 SELECT 中的字段都加到聯合索引中,這也就是寬索引的概念。但是需要注意,如果索引字段過多,存儲和維護索引的成本也會增加。

不推薦使用或索引失效情況

  • 數據量很小的表

  • 有大量重復數據的字段

  • 頻繁更新的字段

  • 如果對索引字段使用了函數或者表達式計算,索引失效

  • innodb OR 條件沒有對所有條件創建索引,索引失效

  • 大于小于條件 < >,索引是否生效取決于命中的數量比例,如果命中數量很多,索引生效,命中數量很小,索引失效

  • 不等于條件 != <>,索引失效

  • LIKE 值以 % 開頭,索引失效

推薦學習:mysql視頻教程

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
亚洲久久中文字幕| 国产成年人视频网站| 成人免费观看视频在线观看| 亚洲一级免费观看| 99久久免费观看| 欧美成年人视频在线观看| 国产成人亚洲综合无码| 无限资源日本好片| 女性隐私黄www网站视频| 精品视频在线观看一区二区| 91亚洲精品久久久蜜桃借种| 欧美成人黑人猛交| 国产老熟妇精品观看| 成人高清在线观看视频| www.国产视频.com| 男女啪啪网站视频| 日韩毛片在线免费看| 奇米影视亚洲色图| 99er在线视频| 老司机午夜网站| 国产奶头好大揉着好爽视频| 欧美日韩一区二区三区69堂| 精品www久久久久奶水| 黄色免费视频大全| 无码播放一区二区三区| www在线观看免费| 国产96在线 | 亚洲| 少妇高潮喷水在线观看| 无罩大乳的熟妇正在播放| a级黄色小视频| 久久精品国产sm调教网站演员 | 精品久久免费观看| 久久久国产精华液999999| 日韩欧美中文在线视频| 97人人爽人人| 黄色小视频大全| 日韩亚洲欧美视频| av免费观看大全| 妞干网在线免费视频| 2025韩国理伦片在线观看| 亚洲欧美日韩精品一区| 污污的视频免费观看| 国产又粗又猛又爽又黄的网站 | 欧美特级aaa| 国产三级生活片| 992tv快乐视频| 日韩精品xxxx| 91在线第一页| 成人免费观看在线| www.日本xxxx| 黄色一级片国产| 国内外成人免费激情视频| 国产免费中文字幕| 福利视频一区二区三区四区| 日本新janpanese乱熟| 手机在线观看日韩av| 每日在线观看av| 中文字幕视频三区| 亚洲不卡中文字幕无码| 日本中文字幕观看| 欧美成人高潮一二区在线看| 午夜视频在线网站| 欧美视频第三页| 免费观看亚洲视频| 超碰在线97免费| 国产九色porny| 91欧美一区二区三区| 黑鬼大战白妞高潮喷白浆| 福利网在线观看| 噼里啪啦国语在线观看免费版高清版| 亚洲综合激情五月| 五月天激情视频在线观看| 男人添女人下部视频免费| 怡红院亚洲色图| 日韩视频在线免费看| 成品人视频ww入口| 91嫩草国产丨精品入口麻豆| 中文字幕成人在线视频| 能在线观看的av网站| 国产视频一视频二| 久久av综合网| 欧美视频在线第一页| www亚洲国产| 樱花草www在线| 亚洲va综合va国产va中文| 成人精品小视频| 十八禁视频网站在线观看| 日韩av片在线看| 日本www在线播放| av天堂永久资源网| 国产男女无遮挡| www国产黄色| 精品视频无码一区二区三区| 国产综合av在线| 欧美日本视频在线观看| 国产精品无码av在线播放| 国产精品333| 中文字幕乱码人妻综合二区三区 | 国产精品99久久免费黑人人妻| 少妇高潮毛片色欲ava片| 男女视频网站在线观看| 日韩国产欧美亚洲| 欧美日韩亚洲一二三| 精品999在线| xxx中文字幕| 亚洲理论电影在线观看| 男人添女人下面高潮视频| 久久国产乱子伦免费精品| 亚洲欧美自拍另类日韩| 精品一区二区成人免费视频| 成人午夜免费在线视频| 日本免费一级视频| 免费av不卡在线| 国产在线观看欧美| av天堂永久资源网| 中文字幕丰满乱码| 日本免费a视频| 波多野结衣天堂| 免费看污污视频| 欧美一级黄色片视频| 亚洲第一区第二区第三区| wwwjizzjizzcom| 丁香婷婷激情网| 懂色av粉嫩av蜜臀av| 日韩av在线综合| 400部精品国偷自产在线观看| 国产精品va无码一区二区| 色网站在线视频| 久久国产亚洲精品无码| 国产又大又长又粗又黄| 国产精品涩涩涩视频网站| 国产女主播av| 国产福利精品一区二区三区| 成人免费在线小视频| wwwjizzjizzcom| 亚洲黄色av片| 国产一二三四在线视频| 国产成人永久免费视频| 欧美一级特黄aaa| 99视频免费播放| www.中文字幕在线| 青青草国产免费| 99久re热视频精品98| 男人的天堂最新网址| 男人天堂成人在线| 国产超级av在线| 黄色一级片在线看| 欧美中文字幕在线观看视频| 色男人天堂av| 一区二区三区国产好的精华液| 国产福利影院在线观看| 国产裸体舞一区二区三区 | 日本美女高潮视频| 国内外成人激情视频| 性高湖久久久久久久久aaaaa| 欧美 另类 交| 三年中国中文在线观看免费播放| 奇米视频888| 亚洲天堂av一区二区| 999精品视频在线| www.久久久精品| 色噜噜狠狠一区二区三区狼国成人| 五月婷婷深爱五月| 日本免费色视频| 韩国一区二区在线播放| 一本二本三本亚洲码| 二级片在线观看| 亚洲理论电影在线观看| 免费看日本毛片| 日韩一级在线免费观看| 五月婷婷丁香色| 最新av在线免费观看| 欧美又粗又长又爽做受| 欧美 激情 在线| 激情文学亚洲色图| 国产美女主播在线| 男人舔女人下面高潮视频| 欧美第一页浮力影院| 经典三级在线视频| 久久无码高潮喷水| 99国产精品久久久久久| 黄色一级大片免费| 久久精品.com| 欧美一级免费在线观看| 777久久久精品一区二区三区| 狠狠热免费视频| 4444在线观看| 青青草精品视频在线观看| 青娱乐精品在线| 漂亮人妻被中出中文字幕| 小早川怜子一区二区三区| 国产原创中文在线观看| 欧美日韩一区二区三区69堂| 亚洲熟妇无码av在线播放| 亚欧美在线观看| 欧美三级一级片| 日韩在线视频在线| 国产精品自拍视频在线| 日韩欧美亚洲天堂| 久久av高潮av|