正確的順序依賴于使用該索引的查詢,并且同時需要考慮如何更好的滿足排序和分組的需要(本節適用于B-Tree索引)
在一個多列B-Tree索引中,索引列的順序意味著首先按照最左列進行排序,其次是第二列,等等.所以,索引可以按照升序或者降序進行掃描,以滿足精確符合列順序的ORDER BY,GROUP BY和DISTINCT等子句的查詢需要
所以多列索引的列順序很重要.在三星索引系統中,列順序也決定了一個索引是否能夠成為一個真正的三星索引
對于如何選擇索引的列順序有一個經驗法則,將選擇性最高的列放到索引最前列.這個建議在大部分場景下有用,但通常不如避免隨機IO和排序那么重要,考慮問題需要全面
當不需要考慮排序和分組時,將選擇性最高的列放在前面通常是好的.然而,性能不只是依賴于所有索引列的選擇性(整體基數),也和查詢條件的具體值有關,也就是和值的分布有關
以下面的查詢為例子
~~~
select * from payment where staff_id = 2 and customer_id = 584;
~~~
是應該創建一個(staff_id,customer_id)索引還是應該顛倒下順序?可以跑一些查詢來確定在這個表中值的分布情況,并確定那個列的選擇性更高.先用下面的查詢預測下,看看where條件的分支對應的數據基數有多大
~~~
select sum(staff_id = 2), sum(customer_id=584) from payment;
~~~
根據結果,我們來決定把什么放到前面
這樣做有一個地方需要注意,查詢的結果非常依賴于選定的具體值.如果按照上述優化,可能對其他一些條件值的查詢不公平,服務器的整體性能可能變得更糟,或者其他查詢運行變得不如預期
如果是從比如pt-query-digest這樣的工具的報告中提取最差查詢,那么再按上述辦法選定的索引順序往往是非常高效的

最后,盡管關于選擇性和基數的經驗法值得研究,但是別忘了where子句中的排序,分組和范圍條件等其他因素,這些因素可能對查詢的性能造成非常大的影響
- 書列表
- laravel框架關鍵技術
- 第一章 組件化開發與composer使用
- 簡介
- composer
- 添加路由組件
- 添加控制器模塊
- 添加模型組件
- 添加視圖組件
- 第三章 laravel框架中常用的php語法
- 匿名函數
- 文件包含
- 魔術方法
- 魔術常量
- 反射
- 后期靜態綁定
- traits
- 第四章 laravel框架中使用的HTTP協議基礎
- HTTP協議
- 數據庫
- 數據遷移
- 第六章 laravel框架中的設計模式
- IOC模式
- php核心技術與最佳實踐
- 第一章面向對象核心
- 反射
- 簡單ORM
- 異常和錯誤
- 接口
- 第二章,面向對象設計
- 設計原則
- 單一職責
- 接口隔離
- 開放封閉
- 替換原則
- 依賴倒置
- linux是怎么寫的呢?
- 第三章 正則表達
- 認識正則
- 第四章 php網絡技術應用
- HTTP協議詳解
- php和http相關函數
- 垃圾信息防御措施
- 現代操作系統
- 引論
- sql必知必會
- 限制結果
- 按位置排序
- where求職順序
- IN操作符
- like
- 函數
- group by
- 組合查詢
- 插入檢索出的數據
- 視圖
- 高性能mysql
- 第一章節 mysql架構與歷史
- mysql架構邏輯圖
- 連接與管理
- 優化與運行
- 讀寫鎖
- 鎖粒度
- 表鎖(table lock)
- 行級鎖(row lock)
- ACID
- 隔離級別
- 死鎖
- 隱式和顯式鎖定
- 多版本并發控制
- Innodb概覽
- 第四章節 Schema與數據類型優化
- 選擇優化的數據類型
- 日期和時間類型
- 標識列
- 特殊類型數據
- 表設計中的缺陷
- 范式
- 計數器表
- 第五章 創建高性能索引
- 索引基礎
- 索引類型
- 索引的優點
- 高性能索引策略
- 選擇合適的索引列順序
- 聚簇索引
- 順序的主鍵什么時候會造成更壞的后果
- 覆蓋索引
- 使用索引掃描來做排序
- 壓縮索引
- 冗余和重復索引
- 索引和鎖
- 支持多種過濾條件
- 什么是范圍條件
- 優化排序
- 維護索引和表
- 表損壞
- 減少索引和數據的碎片
- 第六章 查詢性能優化
- 掃描的行數和訪問類型
- 重構查詢方式
- 查詢執行的基礎
- 重構-改善既有代碼設計
- 第一章-重構
- 什么是重構
- 第一個案列
- 重構第一步
- 王垠博客
- 多態取代價格相關邏輯