前提在開始之前先建立乙個資料表,名為score,具體的字段以及相關的主鍵、索引設定如下:
新增一些資料:
接下來將使用explain對sql語句進行分析,關於生成的分析表中各字段的含**釋可以參考部落格:mysql使用explain時各欄位解釋;接下來就進入正題。
1、索引失效的情況
網上還有提到一種情況:like條件語句進行模糊匹配的時候,如果%在最左邊則索引失效,但是我的測試結果是索引仍然適用,mysql版本5.7
推薦一篇關於explain分析很到位的文章:mysql 效能優化神器 explain 使用分析2、覆蓋索引中的最左匹配原則
最左匹配原則是覆蓋索引中乙個比較重要的概念,如1中介紹的情況就有一種不滿足最左匹配原則導致索引失效的,接下來介紹幾種滿足最左匹配的情況,還以上邊使用的資料為例:
第一種:雖然name和score的位置反了,但是mysql的查詢優化器仍然會找到最高效的執行順序;
第二種:只使用最左側的條件
3、覆蓋索引中的索引下推
索引下推是mysql5.6以後才有的新功能,在2中介紹了幾種滿足最左匹配原則的覆蓋索引查詢操作,我們之前介紹的所要查詢的字段均為我們建立索引或者覆蓋索引中包含的字段,如果我們查詢的字段中包含一些非索引的列會怎樣?我們來測試下:
在原來的條件中在新增乙個所要查詢的字段money,這是看下分析結果,extra變為了using index condition,這其實就是進行了索引下推的操作;在聯合索引內部先根據score=3.22和name='歷史』這兩個條件來分析出對應資料行的id,然後在使用id取資料表中取資料,這樣可以減少回表的次數。而在5.6以前的版本中,mysql會先忽略掉name='歷史』這個條件,先在索引樹中找到score=3.22的節點對應的表的id,然後拿著id去資料表中取資料,由於資料表中score=3.22的資料行可能不止乙個,所以就會造成多次回表的情況。
參考部落格:1、覆蓋索引、聯合索引、索引下推
2、mysql效能優化:什麼是索引下推?
3、mysql之 索引下推
連線與database 相關
資料庫連線 mysql uroot p 密碼 使用root 使用者登陸 mysql 退出 exit quit 檢視當前登陸使用者 select user 檢視當前版本 select version 檢視資料庫 show databases 建立資料庫 create database 資料庫名 刪除資...
HiveQL之Database相關操作
1 create database 建立資料庫語法 create database schema if not exists database name comment database comment location hdfs path with dbproperties property na...
關於lucene斷點續索引和增量索引的問題zz
2 如何在我給乙個目錄裡新增乙個檔案的時候自動把這個檔案用lucene索引起來,就是所謂的增量索引,難道用個timer掃瞄目錄變化或者用filewatch來監視這個目錄,然後對其索引嗎?可是這樣的話必須做個windows服務了,要不這個軟體關閉的話就不能相應目錄裡檔案的變化了。3 如果乙個檔案修改或...