天天看點

Mysql千萬資料索引查詢優化

Mysql千萬資料索引查詢優化

1.索引的作用

索引就是想是書的目錄,能夠幫助快速查詢。如果資料庫沒有索引的話,在查詢的時候,就會進行全表掃描,在資料量大的情況下(幾百萬,上千萬)的時候,查詢會特别慢需要幾秒,這個線上上系統是無法滿足應用要求的。加上索引後查詢隻要幾十毫秒,百倍的優化。

2. 索引的類型 1.  聚簇索引(主鍵索引): 葉子節點即是資料節點,索引的順序就是實體存儲的順序;

2. 普通索引(二級索引):建立在非主鍵上的索引,二級的意思是說:需要兩次才能拿到資料,二級索引的葉子節點隻是儲存了資料存放的指針,然後再根據地質擷取資料;

3. 組合(聯合)索引:用于多字段組合查詢的情況,注意需要按照索引順序來才能利用索引,滿足最左側查詢需求,例如(a,b,c)組合索引,則 (a) ,(a,b),(a,b,c)都可以利用索引加速查詢。  最左側查詢并不是指的寫sql語句的順序(很多朋友會存在誤解),sql在會進行查詢優化的。盡量避免中間索引的查詢條件過大,比如 >1 之類的,sql執行type會變成range, ​​​​​ 4. 唯一限制:可以在資料庫系統上保證資料上唯一限制,如果在應用層做查詢再判讀,在多并發情況容易出現一些髒資料 。​

加索引:  alert table *** add index(索引列); 删除索引: drop index 索引名  on table; 檢視索引: show index 索引名 from table; 檢視表結構: describe table 表名;

3. 查詢速度的優化可以分為兩塊: ​1)硬體 : 替換更大的記憶體、CPU、硬碟大小等 ​2)軟體 : ​    ​1.最簡單實用的是加索引;     ​​2.慢查詢sql優化; ​    ​3.借用緩存+更新消息失效的方式來減少db的通路量和速度,這裡需要考慮緩存預熱和命中率,不然瞬間的流量高峰就會把應用和資料庫擊穿,沖垮;     4. ​分庫分表降低單庫單表的容量,提高查詢速度。​ ​​

1. 注意線上系統的加索引,特别是資料量大的情況,mysql5.6版本之前資料庫會鎖表(waiting for metadata lock),會很慢,導緻線上資料表暫時不可用情況,花費時間較長。這種大表的表結構變更一定要在流量小的情況下操作,避免影響線上業務。

Historically, many DDL operations on InnoDB tables were expensive. Many ALTER TABLE operations worked by creating a new, empty table defined with the requested table options and indexes, then copying the existing rows to the new table one-by-one, updating the indexes as the rows were inserted. After all rows from the original table were copied, the old table was dropped and the copy was renamed with the name of the original table.

5.6 引入了onlineDDL,另外在一個事物中,修改表結構或者添加索引會鎖表。

4. sql執行解釋

 我們可以通過簡單指令來 explain sql ;  來看一條sql語句的執行過程是怎麼樣的,有沒有用索引和需要檢查的行數等。

​​

繼續閱讀