国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

MySQL中利用索引對數據進行排序的基礎教程

來源:懂視網 責編:小采 時間:2020-11-09 20:54:33
文檔

MySQL中利用索引對數據進行排序的基礎教程

MySQL中利用索引對數據進行排序的基礎教程:MySQL中,有兩種方式生成有序結果集:一是使用filesort,二是按索引順序掃描。利用索引進行排序操作是非常快的,而且可以利用同一索引同時進行查找和排序操作。當索引的順序與ORDER BY中的列順序相同且所有的列是同一方向(全部升序或者全部降序)時,可以使用
推薦度:
導讀MySQL中利用索引對數據進行排序的基礎教程:MySQL中,有兩種方式生成有序結果集:一是使用filesort,二是按索引順序掃描。利用索引進行排序操作是非常快的,而且可以利用同一索引同時進行查找和排序操作。當索引的順序與ORDER BY中的列順序相同且所有的列是同一方向(全部升序或者全部降序)時,可以使用

MySQL中,有兩種方式生成有序結果集:一是使用filesort,二是按索引順序掃描。利用索引進行排序操作是非常快的,而且可以利用同一索引同時進行查找和排序操作。當索引的順序與ORDER BY中的列順序相同且所有的列是同一方向(全部升序或者全部降序)時,可以使用索引來排序。如果查詢是連接多個表,僅當ORDER BY中的所有列都是第一個表的列時才會使用索引。其它情況都會使用filesort。

MySQL索引通常是被用于提高WHERE條件的數據行匹配或者執行聯結操作時匹配其它表的數據行的搜索速度。
MySQL也能利用索引來快速地執行ORDER BY和GROUP BY語句的排序和分組操作。
通過索引優化來實現MySQL的ORDER BY語句優化:

create table actor(

actor_id int unsigned NOT NULL AUTO_INCREMENT,

name varchar(16) NOT NULL DEFAULT '',

password varchar(16) NOT NULL DEFAULT '',

PRIMARY KEY(actor_id),

 KEY (name)

) ENGINE=InnoDB

insert into actor(name,password) values('cat01','1234567');

insert into actor(name,password) values('cat02','1234567');

insert into actor(name,password) values('ddddd','1234567');

insert into actor(name,password) values('aaaaa','1234567');

mysql> explain select actor_id from actor order by actor_id \G

*************************** 1. row ***************************

 id: 1

 select_type: SIMPLE

 table: actor

 type: index

possible_keys: NULL

 key: PRIMARY

 key_len: 4

 ref: NULL

 rows: 4

 Extra: Using index

1 row in set (0.00 sec)

mysql> explain select actor_id from actor order by password \G

*************************** 1. row ***************************

 id: 1

 select_type: SIMPLE

 table: actor

 type: ALL

possible_keys: NULL

 key: NULL

 key_len: NULL

 ref: NULL

 rows: 4

 Extra: Using filesort

1 row in set (0.00 sec)

mysql> explain select actor_id from actor order by name \G

*************************** 1. row ***************************

 id: 1

 select_type: SIMPLE

 table: actor

 type: index

possible_keys: NULL

 key: name

 key_len: 18

 ref: NULL

 rows: 4

 Extra: Using index

1 row in set (0.00 sec)

下面來羅列一些常見的索引對ORFER BY的優化情況:

1、如果一個SQL語句形如:

SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort];

在[sort]這個欄位上建立索引就可以實現利用索引進行order by 優化。
2、WHERE + ORDER BY的索引優化,形如:

SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort];

建立一個聯合索引(columnX,sort)來實現order by 優化。
注意:如果columnX對應多個值,如下面語句就無法利用索引來實現order by的優化

SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] IN ([value1],[value2],…) ORDER BY[sort];

3、WHERE+ 多個字段ORDER BY

SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10;

建立索引(uid,x,y)實現order by的優化,比建立(x,y,uid)索引效果要好得多。
MySQL Order By不能使用索引來優化排序的情況
* 對不同的索引鍵做 ORDER BY :(key1,key2分別建立索引)

SELECT * FROM t1 ORDER BY key1, key2;

* 在非連續的索引鍵部分上做 ORDER BY:(key_part1,key_part2建立聯合索引;key2建立索引)

SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;

* 同時使用了 ASC 和 DESC:(key_part1,key_part2建立聯合索引)

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

* 用于搜索記錄的索引鍵和做 ORDER BY 的不是同一個:(key1,key2分別建立索引)

SELECT * FROM t1 WHERE key2=constant ORDER BY key1;

* 如果在WHERE和ORDER BY的欄位上應用表達式(函數)時,則無法利用索引來實現order by的優化

SELECT * FROM t1 ORDER BY YEAR(logindate) LIMIT 0,10;

當MySQL不能使用索引進行排序時,就會利用自己的排序算法(快速排序算法)在內存(sort buffer)中對數據進行排序,如果內存裝載不下,它會將磁盤上的數據進行分塊,再對各個數據塊進行排序,然后將各個塊合并成有序的結果集(實際上就是外排序)。對于filesort,MySQL有兩種排序算法。
1.兩遍掃描算法(Two passes)
實現方式是先將須要排序的字段和可以直接定位到相關行數據的指針信息取出,然后在設定的內存(通過參數sort_buffer_size設定)中進行排序,完成排序之后再次通過行指針信息取出所需的Columns。
注:該算法是4.1之前采用的算法,它需要兩次訪問數據,尤其是第二次讀取操作會導致大量的隨機I/O操作。另一方面,內存開銷較小。
2. 一次掃描算法(single pass)
該算法一次性將所需的Columns全部取出,在內存中排序后直接將結果輸出。
注:從 MySQL 4.1 版本開始使用該算法。它減少了I/O的次數,效率較高,但是內存開銷也較大。如果我們將并不需要的Columns也取出來,就會極大地浪費排序過程所需要的內存。在 MySQL 4.1 之后的版本中,可以通過設置 max_length_for_sort_data 參數來控制 MySQL 選擇第一種排序算法還是第二種。當取出的所有大字段總大小大于 max_length_for_sort_data 的設置時,MySQL 就會選擇使用第一種排序算法,反之,則會選擇第二種。為了盡可能地提高排序性能,我們自然更希望使用第二種排序算法,所以在 Query 中僅僅取出需要的 Columns 是非常有必要的。

當對連接操作進行排序時,如果ORDER BY僅僅引用第一個表的列,MySQL對該表進行filesort操作,然后進行連接處理,此時,EXPLAIN輸出“Using filesort”;否則,MySQL必須將查詢的結果集生成一個臨時表,在連接完成之后進行filesort操作,此時,EXPLAIN輸出“Using temporary;Using filesort”。

您可能感興趣的文章:

  • MySQL InnoDB 二級索引的排序示例詳解
  • mysql 添加索引 mysql 如何創建索引
  • MySQL索引類型總結和使用技巧以及注意事項
  • MySQL查看、創建和刪除索引的方法
  • MySQL 主鍵與索引的聯系與區別分析
  • 基于mysql全文索引的深入理解
  • MYSQL中常用的強制性操作(例如強制索引)
  • MySQL 索引分析和優化
  • mysql性能優化之索引優化
  • mysql索引對排序的影響實例分析
  • 聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    MySQL中利用索引對數據進行排序的基礎教程

    MySQL中利用索引對數據進行排序的基礎教程:MySQL中,有兩種方式生成有序結果集:一是使用filesort,二是按索引順序掃描。利用索引進行排序操作是非常快的,而且可以利用同一索引同時進行查找和排序操作。當索引的順序與ORDER BY中的列順序相同且所有的列是同一方向(全部升序或者全部降序)時,可以使用
    推薦度:
    標簽: 數據 教程 排序
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 欧美亚洲另类在线观看 | 亚洲欧美国产精品 | 国产一区二区三区视频在线观看 | 成人一区二区免费中文字幕 | 国产欧美在线观看一区二区 | 亚洲国产精品一区二区久久 | 久久国产精品久久精 | 国产成人h片视频在线观看 国产超级乱淫片中文 | 欧美国产日韩一区二区三区 | 亚欧洲精品在线视频免费观看 | 最新国产在线 | 天天做天天摸天天爽天天爱 | 日韩在线免费 | 日韩欧美一区二区三区中文精品 | 国产精品久久精品 | 欧美日韩亚洲综合 | 久久a毛片 | 最新大黄网站免费 | 日韩高清第一页 | 欧美久久天天综合香蕉伊 | 欧美一区二区在线 | 日本另类αv欧美另类aⅴ | 黄视频网站在线看 | 免费看欧美日韩一区二区三区 | 亚洲天堂欧美 | 香蕉久久夜色精品国产小说 | 国产成人一区二区三区 | 日韩欧美电影在线观看 | 国产va在线视频观看 | 欧美国产视频 | 久久久久免费精品国产小说 | 91精品日本久久久久久牛牛 | 欧美日韩综合精品一区二区三区 | 日韩亚洲欧美视频 | 亚洲欧美中文字幕 | 精品免费在线 | 亚洲专区路线一路线二天美 | 日韩午夜视频在线观看 | 日韩欧美视频在线 | 欧美成人一级视频 | 国产成人久久一区二区三区 |