MySQL利用索引排序實踐

2021-09-13 21:44:11 字數 2765 閱讀 9840

要使用多列索引(聯合索引),需要滿足最左原則,where條件必須和索引的順序一致,如果只用到單列則必須是最左列。只有當索引的列順序和order by子句的順序完全一致,並且所有列的排序方向(倒序或正序)都一樣時,mysql才能夠使用索引來對結果做排序。如果查詢需要關聯多張表,則只有當order by子句引用的字段全部為第乙個表時,才能使用索引做排序。也需要滿足索引的最左字首要求(例外:前導列為常量的時候)。--摘自《高效能mysql》
建如下表測試索引排序(版本5.7.17),聯合索引:test_realname_***_age_index,單列索引:***_index、age_index,(一次查詢只能利用乙個索引
create table `test` (

`id` int(11) not null auto_increment,

`realname` varchar(10) not null default '',

`***` tinyint(4) not null default '0',

`age` tinyint(4) not null default '0',

`job` varchar(10) not null default '',

primary key (`id`),

key `test_realname_***_age_index` (`realname`,`***`,`age`),

key `***_index` (`***`),

key `age_index` (`age`)

) engine=innodb default charset=utf8

聯合索引測試

使用兩種不同的排序方向排序

能利用索引排序
explain select * from test where realname = 'wen' order by *** desc ,age desc;
不能利用聯合索引排序,因為***和age的排序方向不一致
explain select * from test where realname = 'wen' order by *** desc ,age asc ;
用了乙個不在索引中的列
explain select * from test where realname = 'wen' order by ***,job;
where order by中的列無法組合成索引的最左字首
explain select * from test where realname = 'wen' order by age;
explain select * from test where realname = 'wen' order by ***;
查詢在索引第一列上是範圍條件

explain select * from test where realname > 'wen' order by ***,age;
explain select * from test where realname between 'wen1' and 'wen2' order by ***,age;
索引上有多個等於條件(in)
explain select * from test where realname = 'wen' and *** in (1,2) order by  age;
前導列不為常量,並且使用範圍條件
不能
explain select * from test where realname > 'qqq' order by ***;
能,滿足最左原則
explain select * from test where realname = 'qqq' order by ***;
一般來說:將選擇性最高的列放到索引的最前列。計算方法

select count(distinct realname)/count(*) realname_selectivity,count(distinct ***)/count(*) ***_selectivity,count(distinct age)/count(*) age_selectivity,count(*) total from test;

使用單索引排序的例子

where條件和排序的列不一致

不能使用索引排序
explain select * from test where *** = 1 order by age;
使用了範圍
explain select * from test where age > 17 order by age;
沒有where條件直接排序
主鍵可以排序
explain select * from test order by id;
不能
explain select * from test order by ***;

mysql索引實踐 MySQL索引實踐

資料庫索引本質上是一種資料結構 儲存結構 演算法 目的是為了加快資料檢索速度。1 索引的型別 待完善 主鍵索引 給表設定主鍵,這個表就擁有主鍵索引。唯一索引 unique 普通索引 增加某個欄位的索引,比如使用者表根據使用者名稱查詢。組合索引 使用多個字段建立索引,遵循最左原則,比如建立索引 col...

Mysql利用索引進行order by排序優化

在mysql資料庫中,我們一般都會設計乙個id作為一張表的主鍵,mysql也會預設為我們的id主鍵建立索引,在innnodb中我們稱之為聚合索引。總之,mysql為id主鍵建立索引這件事情我們是清楚的。一般管理系統中,我們查詢資料的時候,會根據業務需要對資料進行排序,於是需要我們sql語句中用到or...

MySql索引優化實踐

mysql 查詢官方預設底層索引這一頁大小 show global status like innodb page size variable name value innodb page size 16384 位元組0 1024 16k 如果乙個節點設定為 bigint 的話mysql 預設是8個...