日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库-优化-索引-索引的优化

發布時間:2024/4/13 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库-优化-索引-索引的优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

索引的優化

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.1

    4、索引維護的方法

    ?????? 由于業務變更,某些索引是后續不需要使用的,就要進行刪除。

    在mysql中,目前只能通過慢查詢日志配合pt-index-usage工具來進行索引使用情況的分析;

    pt-index-usage -uroot -padmin /var/lib/mysql/mysql-host-slow.log

    附:https://www.percona.com/downloads/

    總結

    以上是生活随笔為你收集整理的数据库-优化-索引-索引的优化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。