Mysql 架构及优化之-索引优化
索引基礎知識
索引幫助mysql高效獲取數據的數據結構 索引(mysql中叫"鍵(key)") 數據越大越重要
索引好比一本書,為了找到書中特定的話題,查看目錄,獲得頁碼
select fruit_name from fruit where id = 5 索引列位于id列,索引按值查找并且返回任何包含該值的行
如果索引了多列數據,那么列的順序非常重要
存儲引擎說明
myisam 存儲引擎
表鎖:myisam 表級鎖
不支持自動恢復數據:斷電之后 使用之前檢查和執行可能的修復
不支持事務:不保證單個命令會完成, 多行update 有錯誤 只有一些行會被更新
只有索引緩存在內存中:mysiam只緩存進程內部的索引
緊密存儲:行被僅僅保存在一起
Innodb存儲引擎
事務性:Innodb支持事務和四種事務隔離級別
外鍵:Innodb唯一支持外鍵的存儲引擎 create table 命令接受外鍵
行級鎖:鎖設定于行一級 有很好的并發性
多版本:多版本并發控制
按照主鍵聚集:索引按照主鍵聚集
所有的索引包含主鍵列:索引按照主鍵引用行 如果不把主鍵維持很短 索引就增長很大
優化的緩存:Innodb把數據和內存緩存到緩沖池 自動構建哈希索引
未壓縮的索引:索引沒有使用前綴壓縮
阻塞auto_increment:Innodb使用表級鎖產生新的auto_increment
沒有緩存的count():myisam 會把行數保存在表中 Innodb中的count()會全表或索引掃描
索引類型
索引在存儲引擎實現的,而不是服務層
B-tree 索引
大多數談及的索引類型就是B-tree類型, 可以在create table 和其他命令使用它
myisam使用前綴壓縮以減小索引,Innodb不會壓縮索引 myiam索引按照行存儲物理位置引用被索引的行,Innodb按照主鍵值引用行
B-tree數據存儲是有序的,按照順序保存了索引的列 加速了數據訪問,存儲引擎不會掃描整個表得到需要的數據
B-tree 索引實例
B-tree局限性
B-tree局限性:(案例中索引順序:last_name first_name dob )
如果查找沒有送索引列的最左邊開始,沒有什么用處,即不能查找所有叫Kang 的人 也不能找到所有出生在某天的人,因為這些列不再索引最左邊,也不能使用該索引超找某個姓氏以特定字符結尾的人不能跳過索引的列,即不能找到所有姓氏為Tang并且出生在某個特定日期的人如果不定義first_name列的值,Mysql只能使用索引的第一列存儲引擎不能優化任何在第一個范圍條件右邊的列,比如查詢是where last_name = 'Tang'AND first_name like 'K%' AND dob='1993-09-23' 訪問只能使用索引頭兩列由此可知 索引列順序的重要性!哈希索引
R-tree(空間索引)
全文索引
前綴索引和索引選擇性
前綴索引和索引選擇性實例
#計算得比值接近0.9350就好了
#分別取 3 4 5位name值計算
#可知name列添加5位前綴索引就可以了
#Mysql不能在order by 或 group by查詢使用前綴索引 也不能將其用作覆蓋索引
聚集索引
覆蓋索引
為排序使用索引掃描
避免多余和重復索引
重復索引:類型相同,以同樣的順序在同樣的列創建索引 比如在表user id列 添加 unique(id)約束 、id not null
primary key 約束 index(id) 其實這些是相同的索引 !
多余索引:如存在(A)索引 應該擴展它 滿足 (A,B)索引
(A,B)索引 <==> (B)
(A,B)索引 <==> (A)
(A,B) A最左前綴 (B,A) B最左前綴
索引實例研究
設計user表 字段:country、 state/region 、city 、sex 、age 、eye 、color
功能:支持組合條件搜索用戶 支持用戶排序 用戶上次在線時間
支持多種過濾條件
不在選擇性很差的列添加索引
優化排序
即時有索引 (sex,rating) 高偏移量話費很多時間掃描被丟掉的數據
select name,gender from user inner join (select id from user where x.sex = 'M' order by rating limit 100000,10) as x using (id)基于索引(sex,rating) 提取需要行的主鍵列, 聯接以取得所有需要的列
索引和表維護
表維護三個目標:查找和修復損壞、維護精確的索引統計,并減少碎片
查找并修復表損壞
check table 命令 確定表是否損壞 能抓到大部分表和索引錯誤 repair table 命令修復損壞的表
myisamchk 離線修復工具
更新索引統計
analyze table cs_area 更新索引統計信息 便于優化器優化sql
show index 命令檢查索引的基數性
減少索引和數據碎片
myisam引擎 使用 optimize table 清除碎片 Innodb 引擎 使用 alter table .. engine =
.. 重新創建索引
正則化和非正則化
正則化和非正則化
正則化數據庫:每個因素只會表達一次 教師表teacher (id,school_id) 學校表school
(school_id,school_name) 優點:更新信息只變動一張表 缺點:簡單的學校名稱查詢 需要關聯表
非正則化數據庫:信息是重復的 或者 保存在多個地方
教師表teacher (id,school_id,school_name) 學校表school
(school_id,school_name)
優點:便于直接統計對應學校名稱的老師 缺點:更新需要變動的表多一張
正則化和非正則化并用:比如需要統計用戶的發帖數 可以在user表添加字段num_message 保存發帖總數 避免高密度查詢統計
緩存和匯總表
實例:統計過去24小時發布的信息精確的數量
表周期性創建
周期創建可以得到沒有碎片和全排序索引的高效表
注意此法會將數據清除 只是得到一個沒有碎片和高效的索引表
計數表:比如緩存用戶朋友數量、文件下載次數 通常建立一個單獨的表 以保持快速維護計數器
計劃任務定期聚合函數查詢 更新對應的字段
總結
以上是生活随笔為你收集整理的Mysql 架构及优化之-索引优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 皖事通app如何登录
- 下一篇: 拉结尔失落遗迹怎么进