真 乾貨 MySQL 索引及優化實戰

2021-08-21 08:35:05 字數 3873 閱讀 4421

索引概念和作用

mysql 索引型別

唯一索引:與普通索引類似,不同的就是索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。

主鍵索引:它是一種特殊的唯一索引,用於唯一標識資料表中的某一條記錄,不允許有空值,一般用     primary key 來約束。主鍵和聚集索引的關係詳見「問題詳解」中的第4題。

聯合索引(又叫復合索引):多個欄位上建立的索引,能夠加速復合查詢條件的檢索。

全文索引:老版本     mysql 自帶的全文索引只能用於資料庫引擎為 myisam 的資料表,新版本 mysql 5.6 的 innodb 支援全文索引。預設 mysql 不支援中文全文檢索,可以通過擴充套件 mysql,新增中文全文檢索或為中文內容表提供乙個對應的英文索引表的方式來支援中文。

mysql索引優化規則

* fromdoc where title like 

'%xx'

* fromdoc where title like 

'xx%'

* fromdoc where status=

1all

* fromdoc where status=

2* fromdoc where status in (1, 

2)* fromdoc where status = 

1or status = 

2* fromdoc where status != 

1and status != 

2* fromdoc where status in (0,

3,4)

uid, login_time from user where login_name=? andpasswd=?

如果建立了(a,b)聯合索引,就不必再單獨建立 a 索引。同理,如果建立了(a,b,c)聯合索引,就不必再單獨建立 a、(a,b) 索引。

存在非等號和等號混合判斷條件時,在建索引時,請把等號條件的列前置。如     where a>? and b=?,那麼即使 a 的區分度更高,也必須把 b 放在索引的最前列。

最左側查詢需求,並不是指 sql 語句的 where 順序要和聯合索引一致。

uid, login_time from user where passwd=? andlogin_name=?

範圍列可以用到索引(聯合索引必須是最左字首),但是範圍列後面的列無法用到索引,索引最多用於乙個範圍列,如果查詢條件中有兩個範圍列則無法全用到索引。

* fromemployees.titles where emp_no < 

10010' and title='

senior engineer

'and from_date between '1986-01-01' and '1986-12-31'

* fromdoc where 

year

(create_time) <= 

'2016'

:* fromdoc where create_time <= 

'2016-01-01'

* fromorder where 

date

< = curdate()

* fromorder where 

date

< = 

'2018-01-2412:00:00'

13800001234

* fromuser where phone=

'13800001234'

「性別」這種區分度不大的屬性,建立索引是沒有什麼意義的,不能有效過濾資料,效能與全表掃瞄類似。

一般區分度在80%以上的時候就可以建立索引,區分度可以使用 count(distinct(列名))/count(*) 來計算。

uid, login_time from user where login_name=? andpasswd=?

例如對於語句 where a=? and b=? order by     c,可以建立聯合索引(a,b,c)。

如果索引中有範圍查詢,那麼索引有序性無法利用,如 where     a>10 order by b;,索引(a,b)無法排序。

*from employees.employees where first_name=

'eric'

and last_name=

'anido'

;a.* from 表1

a,(select id from 表1

where 

條件limit

100000,20

) b where a.id=b.id

* fromuser where login_name=?

* fromuser where login_name=? limit 

1ref:使用普通的索引(normal index)。

range:對索引進行範圍檢索。

當 type=index 時,索引物理檔案全掃,速度非常慢。

寧缺勿濫,認為索引會消耗空間、嚴重拖慢更新和新增速度。

抵制惟一索引,認為業務的惟一性一律需要在應用層通過「先查後插」方式解決。

過早優化,在不了解系統的情況下就開始優化。

問題詳解a=1

and b=1b=

1b=1order by time desc

* fromemployees.titles where emp_no between 

'10001'

and'10010'

andtitle=

'senior engineer'

and from_date between 

'1986-01-01'

and 

'1986-12-31'

方法一:如果a 表

tid 

是自增長,並且是連續的,b表的

id為索引。

sql語句如下。

* froma,b where a.tid = b.id and a.tid>

500000

limit

200;

* fromb, (select tid from a limit 

50000

,200

) awhere b.id = a.tid;

a= 3

a= 3 and b = 5

3and c = 

4and b = 

5b= 3

a= 3 and c = 4

3and b > 

10andc = 73

and b like 

'xx%'

andc = 

7tableif not exists 

`article`

(`id`

int(

10) unsigned not

null

auto_increment,

int(

10) unsignednot 

null

,int(10

) unsigned not 

null

,int(10

) unsignednot 

null

,int(10

) unsignednot 

null

,varbinary(

255) not 

null

,text

notnull

,`id`

)author_id, title, content from 

`article`

category_id = 

1and comments > 

1byviews desc limit 1;

結語參考資料

mysql 索引背後的資料結構及演算法原理

網際網路各路資料及實踐

Mysql 索引及優化

索引是什麼?相信大家都用過字典。你是怎麼從厚厚的新華字典中找到你需要找到的那個字的呢?又是怎麼從一本書中快速定位到你需要的章節?我們都是通過書中的目錄,然後根據目錄中的頁碼定位到我們要的資訊。同樣在mysql中也是這樣為我們準備了乙份目錄。當你去通過sql語句查詢的時候用不用索引,以及怎麼用索引。決...

mysql索引及優化

mysql的索引可以從不同的維度來進行區分,如下 這是最基本的索引型別,基於普通字段建立的索引,沒有任何限制。與 普通索引 類似,不同的就是 索引欄位的值必須唯一,但允許有空值 在建立或修改表時追加唯一 約束,就會自動建立對應的唯一索引。它是一種特殊的唯一索引,不允許有空值。在建立或修改表時追加主鍵...

MySQL優化(三) 索引原理及索引優化

b tree索引,它是目前關係型資料庫中查詢資料最為常用和有效的索引,大多數儲存引擎都支援這種索引。使用b tree這個術語,是因為mysql在create table或其它語句中使用了這個關鍵字,但實際上不同的儲存引擎可能使用不同的資料結構,比如innodb就是使用的b tree。中的b是指bal...