一、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...