資料庫SQL,索引優化

2021-08-18 18:19:51 字數 2779 閱讀 2655

一、mysql

索引分為兩種結構

1、hash索引

a)  缺點

i.  只支援等值比較

ii. 

無序,不支援範圍查詢

iii. 

組合索引時,無法單獨使用

iv. 

通過 hash

命中後,資料庫需要再次對比

v.  hash

衝突量過大的情況下,效能較差

2、btree索引

a ) 是否要支援事務,如果要請選擇innodb,如果不需要可以考慮myisam;

b)如果表中絕大多數都只是讀查詢,可以考慮myisam,如果既有讀寫也挺頻繁,請使用innodb。

c)系統奔潰後,myisam恢復起來更困難,能否接受;

d)mysql5.5版本開始innodb已經成為mysql的預設引擎(之前是myisam),說明其優勢是有目共睹的,如果你不知道用什麼,那就用innodb,至少不會差

3、mysql執行計畫(explain,放在sql語句之前即可)

執行計畫值:

4、使用索引的

建議a) 

利用最左前輟(組合索引)

b)  不能過多建立索引

c)  盡量擴充套件索引(通過組合索引)而不要新建索引

d)  不同值較少的列不必要建立索引(如性別)

5、索引優化

--索引什麼時候失效?

索引失效實在使用

like語句查詢時失效

--sql本身優化

不用*,少用函式和like,不用巢狀語句等

a)為合適的列建立索引

索引字段長度 例如:

此處展示的語句用於建立乙個索引,索引使用列名稱的前10個字元。

create index part_of_name on customer (name(10));

因為多數名稱的前10個字元通常不同,所以此索引不會比使用列的全名建立的索引速度慢很多。另外,使用列的一部分建立索引可以使索引檔案大大減小,從而節省了大量的磁碟空間,有可能提高insert操作的速度。

離散度 例如:

select * from payment where staff_id = 2 and customer_id = 584;

上述 sql 語句,是

index(staff_id,customer_id) 合理,還是

index(customer_id,staff_id) 合理。執行語句如下:

select count(distinct customer_id) , count(distinct staff_id) from payment;-- 結果是 599 2

由於 customer_id 的離散度更大,所以應該使用

index(customer_id,staff_id)

b)找到重複和冗餘的索引

之所以要找到重複和冗餘的索引,是因為過多的索引不但影響寫入,而且影響查詢,索引越多,分析越慢。那麼為何重複索引、冗餘索引?概念如下:

重複索引是指相同的列以相同的順序建立的同型別的索引,如下表中 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;

unique(id) 和

primary key 重複了。

冗餘索引是指多個索引的字首列相同,或是在聯合索引中包含了主鍵的索引,例子如下:

create table test( id int not null primary key , name varchar(10) not null , title varchar(50) not null , key(name , id)) engine = innodb;

c)刪除不用的索引

目前 mysql 中還沒有記錄索引的使用情況,但是在 perconmysql 和 mariadb 中可以通過 index_statistics 表來檢視哪些索引未使用,但在 mysql 中目前只能通過慢查詢日誌配合共組

pt-index-usage 來進行索引使用情況的分析。

pt-index-usage -uroot -p '123456' /usr/local/var/mysql/luyiyuandemacbook-pro-slow.log;

d)加冗餘字段

不能所有的字段都加成冗餘字段

,一定是不常變化的字段為冗餘字段

優化前:

汽車表:

id,name,汽車的尺寸,汽車顏色,汽車的生產廠家表的id欄位

生產廠家表

id,name,位址資訊。

我需要展示騎車的資訊列表,列表展示資訊中需要包含生產廠家時,如果

left join,效率會低

如果在單錶中查詢,速度快,

我現在對資料庫進行新增冗餘字段,對資料庫資料優化,

優化後:

汽車表:

id,name,汽車的尺寸,汽車顏色,汽車的生產廠家表的id欄位,廠家的名字

生產廠家表

id,name,位址資訊。

什麼時候可以加冗餘字段?什麼情況下不可以加呢?

如果這個冗餘欄位的資料經常改變,就不建議加冗餘欄位了

資料庫索引 sql優化 引擎

1.索引分類 唯一 非唯 一 聚集 非聚集 主鍵索引 是特殊的唯一索引 聯合索引。2.聚集 非聚集的區別 定義 聚集索引,表記錄的物理順序與鍵的索引排列順序一致 我的理解是 索引和記錄按順序排 非聚集索引,表記錄的物理順序與鍵的索引排列順序不一致 我的理解是 索引和記錄不按順序排 優缺點 聚集索引,...

12 優化資料庫 優化SQL語句 索引

第 一 優化索引 sql語句 分析慢查詢 第二 設計表的時候嚴格按照資料庫的設計正規化來設計資料庫 第三 我們可以加上redis快取,將經常被訪問到的資料,但是不需要經常變化的資料放入至redis快取伺服器裡面 第四 還可優化硬體,在硬體層面,我們可以使用更好的一些硬碟 固態硬碟 使用一些磁碟陣列技...

資料庫索引 索引優化

二 三星索引 三 合適設計理想索引 謂詞簡單謂詞和複雜謂詞 where字句中的每個條件稱為乙個謂詞。過濾因子 描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔的比例 過濾因子 ff 結果集的數量 錶行的數量 平均過濾因子 1 不同列值的數量 索引片及匹配列 乙個索引定義乙個索引片,如果where...