数据库-优化-索引-索引的优化
索引的優化
1、什么是索引?
索引的作用相當于圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
? ? ?數據庫使用索引以找到特定值,然后順指針找到包含該值的行。在表中建立索引,然后在索引中找到符合查詢條件的索引值,最后通過保存在索引中的ROWID(相當于頁碼)快速找到表中對應的記錄。索引的建立是表中比較有指向性的字段,相當于目錄,比如說行政區域代碼,同一個地域的行政區域代碼都是相同的,那么給這一列加上索引,避免讓它重復掃描,從而達到優化的目的!
2、如何創建索引
在執行CREATE TABLE語句時可以創建索引,也可以單獨用CREATE INDEX或ALTER TABLE來為表增加索引。
?????? 1、ALTER TABLE
ALTER TABLE用來創建普通索引、UNIQUE索引或PRIMARY KEY索引。
ALTER TABLE table_name ADD INDEX index_name (column_list) ALTER TABLE table_name ADD UNIQUE (column_list) ALTER TABLE table_name ADD PRIMARY KEY (column_list)說明:其中table_name是要增加索引的表名,column_list指出對哪些列進行索引,多列時各列之間用逗號分隔。索引名index_name可選,缺省時,MySQL將根據第一個索引列賦一個名稱。另外,ALTER TABLE允許在單個語句中更改多個表,因此可以在同時創建多個索引。
?
2、CREATE INDEX
CREATE INDEX可對表增加普通索引或UNIQUE索引。 CREATE INDEX index_name ON table_name (column_list) CREATE UNIQUE INDEX index_name ON table_name (column_list)?????? 說明:table_name、index_name和column_list具有與ALTER TABLE語句中相同的含義,索引名不可選。另外,不能用CREATE INDEX語句創建PRIMARY KEY索引。
3、索引類型
在創建索引時,可以規定索引能否包含重復值。如果不包含,則索引應該創建為PRIMARY KEY或UNIQUE索引。對于單列惟一性索引,這保證單列不包含重復的值。對于多列惟一性索引,保證多個值的組合不重復。
PRIMARY KEY索引和UNIQUE索引非常類似。
事實上,PRIMARY KEY索引僅是一個具有名稱PRIMARY的UNIQUE索引。這表示一個表只能包含一個PRIMARY KEY,因為一個表中不可能具有兩個同名的索引。
下面的SQL語句對students表在sid上添加PRIMARY KEY索引。
ALTER TABLE students ADD PRIMARY KEY (sid)
4、刪除索引
可利用ALTER TABLE或DROP INDEX語句來刪除索引。類似于CREATE INDEX語句,DROP INDEX可以在ALTER TABLE內部作為一條語句處理,語法如下。
DROP INDEX index_name ON talbe_name ALTER TABLE table_name DROP INDEX index_name ALTER TABLE table_name DROP PRIMARY KEY其中,前兩條語句是等價的,刪除掉table_name中的索引index_name。
第3條語句只在刪除PRIMARY KEY索引時使用,因為一個表只可能有一個PRIMARY KEY索引,因此不需要指定索引名。如果沒有創建PRIMARY KEY索引,但表具有一個或多個UNIQUE索引,則MySQL將刪除第一個UNIQUE索引。
如果從表中刪除了某列,則索引會受到影響。對于多列組合的索引,如果刪除其中的某列,則該列也會從索引中刪除。如果刪除組成索引的所有列,則整個索引將被刪除。
?5、查看索引
mysql> show index from tblname;mysql> show keys from tblname;6、什么情況下,使用索引了?
?1、表的主關鍵字
2、自動建立唯一索引
3、表的字段唯一約束
4、直接條件查詢的字段(在SQL中用于條件約束的字段)
5、查詢中與其它表關聯的字段
6、查詢中排序的字段(排序的字段如果通過索引去訪問那將大大提高排序速度)
7、查詢中統計或分組統計的字段
8、表記錄太少(如果一個表只有5條記錄,采用索引去訪問記錄的話,那首先需訪問索引表,再通過索引表訪問數據表,一般索引表與數據表不在同一個數據塊)
9、經常插入、刪除、修改的表(對一些經常處理的業務表應在查詢允許的情況下盡量減少索引)
10、數據重復且分布平均的表字段(假如一個表有10萬行記錄,有一個字段A只有T和F兩種值,且每個值的分布概率大約為50%,那么對這種表A字段建索引一般不會提高數據庫的查詢速度。)
11、經常和主字段一塊查詢但主字段索引值比較多的表字段
12、對千萬級MySQL數據庫建立索引的事項及提高性能的手段
3、如何選擇合適的列建立索引
1、在where從句,group by從句,order by從句,on從句中的列添加索引
?????? 2、索引字段越小越好(因為數據庫數據存儲單位是以“頁”為單位的,數據存儲的越多,IO也會越大)
3、離散度大的列放到聯合索引的前面
例子:
select * from payment where staff_id =2 and customer_id =584;注意:
?????? 是index(staff_id,customer_id)好,還是index(customer_id,staff_id)好
那我們怎么進行驗證離散度好了?
A、我們先查看一下表結構
desc payment;B、分別查看這兩個字段中不同的id的數量,數量越多,則表明離散程度越大:因此可以通過下圖看出:customer_id 離散程度大。
結論:由于customer_id 離散程度大,使用index(customer_id,staff_id)好
C、mysql聯合索引
?
①命名規則 :表名_字段名
?1、需要加索引的字段,要在where條件中
2、數據量少的字段不需要加索引
3、如果where條件中是OR關系,加索引不起作用
4、符合最左原則
②什么是聯合索引
所以說創建復合索引時,應該仔細考慮列的順序。對索引中的所有列執行搜索或僅對前幾列執行搜索時,復合索引非常有用;僅對后面的任意列執行搜索時,復合索引則沒有用處。
4、索引優化SQL的方法
1、索引的維護及優化(重復及冗余索引)
?????? 增加索引會有利于查詢效率,但會降低insert,update,delete的效率,但實際上往往不是這樣的,過多的索引會不但會影響使用效率,同時會影響查詢效率,這是由于數據庫進行查詢分析時,首先要選擇使用哪一個索引進行查詢,如果索引過多,分析過程就會越慢,這樣同樣的減少查詢的效率,因此我們要知道如何增加,有時候要知道維護和刪除不需要的索引
2、如何找到重復和冗余的索引
重復索引:
重復索引是指相同的列以相同的順序建立的同類型的索引,如下表中的 primary key和ID列上的索引就是重復索引
create table test( id int not null primary key, name varchar(10) not null, title varchar(50) not null, unique(id) )engine=innodb;冗余索引:
?????? 冗余索引是指多個索引的前綴列相同,或是在聯合索引中包含了主鍵的索引,下面這個例子中key(name,id)就是一個冗余索引。
create table test( id int not null primary key, name varchar(10) not null, title varchar(50) not null, key(name,id) )engine=innodb;說明:對于innodb來說,每一個索引后面,實際上都會包含主鍵,這時候我們建立的聯合索引,又人為的把主鍵包含進去,那么這個時候就是一個冗余索引。
3、如何查找重復索引
工具:使用pt-duplicate-key-checker工具檢查重復及冗余索引
pt-duplicate-key-checker -uroot -padmin -h 127.0.0.14、索引維護的方法
?????? 由于業務變更,某些索引是后續不需要使用的,就要進行刪除。
在mysql中,目前只能通過慢查詢日志配合pt-index-usage工具來進行索引使用情況的分析;
pt-index-usage -uroot -padmin /var/lib/mysql/mysql-host-slow.log附:https://www.percona.com/downloads/
總結
以上是生活随笔為你收集整理的数据库-优化-索引-索引的优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库-优化-Limit查询的优化
- 下一篇: 数据库-优化-索引-索引的优化注意事项