Mysql 索引優化

2021-06-27 13:13:09 字數 2402 閱讀 1933

1、索引的儲存分類

myisam儲存引擎的表資料和索引是自動分開儲存的,各自是獨一的乙個檔案

innodb儲存引擎的表資料和索引是儲存在同乙個表空間裡面,但可以由多個檔案構成。

mysql 目前不支援函式索引,但是能對列的前面某一部分進行索引

例如name欄位,可以只取name的前4個字元進行索引,可降低索引檔案大小。

mysql> create index ind_company_name on company(name(4));

說明:ind_company_name索引名,company表名

2、使用like的查詢,後面如果是常量,並且%號不在第乙個字元,索引才可能被用上

eg: mysql> select * from t1 where id like "3%"; 推薦

mysql> select * from t1 where id like "3%"; 不推薦 (索引用不上)

3、如果對大的文字進行索引,使用全文索引而不使用like"%....%"

4、如果列名是索引,使用column_name is null 將使用索引。

eg: mysql> desc select * from company where name is null\g

5、存在索引但不使用索引

6、如果mysql估計使用索引比全表掃瞄更慢,則不使用索引。

例如:如果列key_part均勻的分布在1-100之間,查詢時使用索引就不好。

eg:mysql> select * from table_name where key_part>1 and key_part<90;

7、如果使用memory/heap 表並且where條件中不適用「=」進行索引列,那麼不會用到索引。heap表只有在「=」的條件下會使用索引。

8、用or分割開的條件,如果or前的條件中的列有索引,而後面的列沒有索引,那麼涉及的索引都不會被使用。

9、如果不是索引列的第一部分,那麼查詢中這個索引也不會被mysql採用。

eg: mysql> desc select * from sales where moneys=1\g

moneys上面建有復合索引,但是moneys不是索引的第一列。

10、如果列型別是字串,但是查詢時把乙個數值型常量複製給了乙個字元型的列名name,那麼雖然name列有索引,也不會使用。

eg: mysql> desc select * from company where name=123\g  (字串索引使用整形資料查詢,不會使用索引)

mysql> desc select * from company where name="123"\g (使用上索引)

檢視mysql索引使用情況

mysql> show status like 'handle_read%';

如果索引正在工作,handler_read_key的值將很高,這個值代表索引被使用次數。

handler_read_rnd_next的值高意味著查詢執行低效,並且應該建立索引補救。

2個簡單實用的優化技巧

a、定期分析表和檢查表

mysql> analyze  [local | no_write_to_binlog] table tab_name [,tab_name1]...;

本語句用於分析和儲存表的關鍵字分布,分析結果可以使系統得到準確的統計資訊。使sql能夠生成正確的行計畫。

eg: mysql> analyze table sales;

分析表的語法如下: (檢查乙個或多個表是否有錯誤)

mysql> check table tab_name [,tab1_name]...[option]...option=

eg: mysql> check table sales;

b、定期優化表

優化表的語法格式:

mysql> optimize [local | no_write_to_binlog] tab_name [,tab_name1]..

如果已經刪除了表的一大部分,或者已經對含有可變長度行的表進行了很多的改動,則需要定期優化。

這個命令可以將表中的空間碎片進行合併,但是只對myisam、bdb和innodb表起作用。

eg: mysql> optimize table sales;   (不要在mysql訪問數大的情況下使用)

常用sql的優化 

大批量插入資料

當用load命令匯入資料的時候,適當設定可以提高匯入速度

對於myiasm儲存引擎的表,可以用個一下方式快速匯入大量資料

alter table tab_name disable keys loading the data

alter table tab_name enable keys

disable keys 和 enable keys 用來開啟或關閉myisam表非唯一索引的更新,可以提高速度,對innodb無效。

mysql 優化 聚集索引 mysql 索引優化

一.聚集索引 clustered index innodb預設依據主鍵列聚集,myisam不使用 特點 b樹每個葉子包含實際資料行,資料按照索引順序地儲存在物理頁上。優點 1.範圍查詢,獲取指定id的全部資料只需從磁碟讀取少量資料頁 如果不使用聚集索引,每條資料可能引起一次磁碟io。2.由於索引和資...

mysql索引優化原則 MySQL 索引優化原則

索引優化原則 1 最左字首匹配原則,聯合索引,mysql會從做向右匹配直到遇到範圍查詢 3 and d 4 如果建立 a,b,c,d 順序的索引,d是用不到索引的,如果建立 a,b,d,c 的索引則都可以用到,a,b,d的順序可以任意調整。2 和in可以亂序,比如a 1 and b 2 and c ...

mysql索引優化原則 MySQL索引優化

mysql官方對索引的定義 索引是幫助mysql高效獲取資料的資料結構。索引是在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。如myisam和innodb儲存引擎只支援btree索引 memory和heap儲存引擎可以支援hash和btree索引。這裡僅針對常用的innodb儲存引擎所支援的b...