中文字幕av高清_国产视频一二区_男女羞羞羞视频午夜视频_成人精品一区_欧美色视_在线视频这里只有精品

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > Using where;Using index和Using index condition區別是什么?

Using where;Using index和Using index condition區別是什么?

來源:千鋒教育
發布人:xqq
時間: 2023-10-13 04:44:46 1697143486

一、Using where;Using index和Using index condition區別是什么

using index代表使用覆蓋索引,不用回表using where代表數據庫引擎返回結果后mysql server還會再次篩選。(引擎就是innodb這種,要注意區分引擎和mysql server的區別。)using condition index代表使用二級索引不夠還要回表,但回表之前會過濾此二級索引能過濾的where條件。總之,Using where、Using index、Using index condition三者的區別主要在于是否需要全表掃描、是否使用了覆蓋索引、以及是否采用了索引條件過濾等技術來提高查詢性能。使用合適的索引和查詢方式,可以顯著提高MySQL的查詢性能和效率。

二、MySQL索引優化Using where、Using filesort

1、官方定義

Explain分析SQL語句的時候,經常發現有的語句在Extra列會出現Using filesort,根據MySQL官方文檔對他的描述:

MySQL must do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows according to the join type and storing the sort key and pointer to the row for all rows that match the WHERE clause。

中文手冊上的翻譯:Mysql需要額外的一次傳遞,以找出如何按排序順序檢索行,通過根據聯接類型瀏覽所有行并為所有匹配where子句的行保存排序關鍵字和行的指針來完成排序,然后關鍵字被排序,并按排序順序檢索行。

總的來說,Using filesort 是Mysql里一種速度比較慢的外部排序,如果能避免是較好的了,很多時候,我們可以通過優化索引來盡量避免出現Using filesort,從而提高速度。

2、實例

這里舉個簡單的例子:

CREATE TABLE testing (id int(10) unsigned NOT NULL auto_increment,room_number int(10) unsigned NOT NULL default '0',PRIMARY KEY (id),KEY room_number (room_number)) ENGINE=MyISAM DEFAULT CHARSET=latin1

寫個存儲過程askwan,插入10萬條測試數據:

mysql> DELIMITER $$DROP PROCEDURE IF EXISTS askwan.askwanCREATEPROCEDURE‘askwan‘.‘askwan‘()BEGINDECLAREvINTDEFAULT1;WHILEv<100000;DOINSERTINTOtestingVALUES(v,v);SETv=v+1;ENDWHILE;ENDmysql> DELIMITER ;mysql> CALL askwan();Query OK, 1 row affected (13.21 sec)

開始試驗,由上面例子中建立的表信息,我已經建立了兩個索引,一個主鍵id,一個room_number列索引
那現在來看一條SQL:

SELECT id FROM testing WHERE room_number=1000 ORDER BY id ;

分析一下:

mysql> EXPLAIN SELECT id FROM testing WHERE room_number=1000 ORDER BY id ;
+----+-------------+---------+------+---------------+-------------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+-------------+---------+-------+------+-----------------------------+
| 1 | SIMPLE | testing | ref | room_number | room_number | 4 | const | 1 | Using where; Using filesort |
+----+-------------+---------+------+---------------+-------------+---------+-------+------+-----------------------------+
1 row in set (0.00 sec)

出現了Using filesort,并且用到了room_number這列索引,但是,在這里用到的索引是針對WHERE后面的room_number條件的,而最后面的排序是根據id來的,這就是手冊中說的,“額外的一次排序”,于是就會出現Using filesort,再建立一個聯合索引 room_number_id:

alter table testing add index room_number_id(room_number,id);

再來分析一下:

mysql> EXPLAIN SELECT id FROM testing WHERE room_number=1000 ORDER BY id ;
+----+-------------+---------+------+----------------------------+----------------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+----------------------------+----------------+---------+-------+------+--------------------------+
| 1 | SIMPLE | testing | ref | room_number,room_number_id | room_number_id | 4 | const | 1 | Using where; |
+----+-------------+---------+------+----------------------------+----------------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)

現在Using filesort不出現了。

3、總結

一般有order by語句,在索引加得不當的情況下,都有可能出現Using filesort,這時候就要對SQL語句和索引進行優化了,但是,并不是說出現Using filesort就是個嚴重的問題,不是這樣的,此次舉的例子比較極端,幾乎不太可能出現這么傻瓜的查詢,優化和不優化,要看它是不是影響了業務性能。從上面可以看到聯合索引,也可以叫多列索引,形如 key (‘A1′,’A2′,’A3′ ,’A4’)等的,排序的思路一般是,先按照A1來排序,A1相同,然后按照A2排序,以此類推,這樣對于(A1),(A1,A2),(A1,A2,A3)的索引都是有效的,但是對于(A2,A3)這樣的索引就無效了。

需要了解MySQL 的特性

一條 SQL 語句只能使用 1 個索引 (5.0-),MySQL 根據表的狀態,選擇一個它認為較好的索引用于優化查詢;聯合索引,只能按從左到右的順序依次使用;從上邊可以看到結合索引,也可以叫多列索引,形如 key (‘B1′,’B2′,’B3′ ,’B4’)等的,排序的思路通常為,先按照B1來排序,B1相同,然后按照B2排序,以此類推,這樣對于(B1),(B1,B2), (B1,B2,B3)的索引都是有效的,可是對于(B2,B3)這樣的索引就無效了。

根據這個特性就可以解決問題:

user_id 和 item_id 是 2 個索引,我的語句中,MySQL 選擇了 user_id,那么 item_id 的索引沒有起到任何用處,所以,當要排序的時候,由于記錄數較多,內存中的排序 buffer 滿了,只能 Using filesort 進行外部排序,因此每次查詢要從磁盤讀取幾十 M 的數據,速度很慢。

修改表結構,刪除 user_id 和 item_id 的 INDEX 索引,建立一個名為 user_item 的聯合 UNIQUE 索引,順序是先 user_id 后 item_id,再 EXPLAIN,這回只有 Using where 了。

延伸閱讀1:MySQL版本介紹

針對不同的用戶,MySQL分為兩個不同的版本:

MySQL Community Server(社區版):該版本完全免費,但是官方不提供技術支持。用戶可以自由下載使用。MySQL Enterprise Server(企業版服務器):為企業提供數據庫應用,支持ACID事務處理,提供完整的提交、回滾、崩潰恢復和行政鎖定功能。需要付費使用,官方提供技術支持。
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
主站蜘蛛池模板: 日本一区二区三区免费观看 | 欧美久久久久久久久久久久 | 性高湖久久久久久久久aaaaa | 久久99精品久久久久久久青青日本 | 成年入口无限观看网站 | 国产精品国产a | 最新色| 日本一区二区三区四区 | 日本在线看 | 亚洲午夜精品 | 每日更新av | 日韩精品视频一区二区三区 | 日韩精品123 | 日韩成人一区二区 | 成人免费小视频 | 日本久久久久久久久久 | 黄色a视频 | av免费观看网页 | 亚洲人成网亚洲欧洲无码 | 国产午夜久久久久 | 精品久久久久久久 | 亚洲一区二区三区视频免费观看 | av官网在线 | 久久久久一区二区 | 麻豆久久 | 欧美一级片在线观看 | 99精品国产一区二区三区 | 精品精品久久 | 精品在线免费观看 | 欧美干b| 国产97久久 | 色婷婷小说| 天天做天天看 | 91精品国产日韩91久久久久久 | 成人影院一区二区三区 | 国模一区二区三区 | 精品国产黄a∨片高清在线 毛片国产 | 一区二区三区在线播放 | 成人激情视频在线观看 | 欧美国产日韩一区二区三区 | 亚洲视频免费观看 |