1.索引的做用主要是加速查找html
2.索引的的分類有幾類分別爲主鍵索引,惟一索引,普通索引和聯合索引mysql
主鍵索引:主要是主鍵的做用,主鍵不能爲空且不能重複,最後有加速查找的功能sql
惟一索引:它分爲兩部分,一個是惟一約束,一個是索引,數據結構
普通索引:它就是加速查找,對數據沒有什麼要求,函數
聯合索引:把多列組合成一個總體,看成一個索引,通常狀況下都是聯合主鍵,聯合惟一和聯合普通索引(把多列組合在一塊兒設置它們爲一個普通索引,叫聯合普通索引)優化
3.索引能加速查找的然因是一旦創建索引,它就會自動建立一個額外文件(某種格式存儲),而後在進行索引查找時,先在該文件中找到要的信息,而後根據select要顯示的內容,在要查詢表中尋找信息.而若是沒有索引,它會從頭至尾依次查找一遍.因此索引能節省時間.可是創建了索引,在對錶進行增刪改的時候,就有些浪費時間了,由於對錶進行操做時,還要對相應的額外文件進行操做.日誌
4.建立額外文件中的格式存儲方式分爲hash索引和btree索引.默認是btree索引的型式存儲的.htm
hash索引:它通常在單值查詢的時候很快,在範圍查詢的時候很慢,緣由是hash索引是無序的.hash索引的存儲結構是有兩列,一列放hash值,一列放該hash對於表中索引值所在的存儲位置(或是存儲路徑)blog
btree索引:它是以二叉樹結構存儲的數據結構.以下圖排序
創建索引: 形如 create index 索引名 on 表名A(列名a) 表示給A表的a列創建普通索引.如:Create index ix_name on userinfo3(email) 表示給userinfo3表中的email列創建了普通索引.
若是在index前加unique 就是創建惟一索引,
即create unique index 索引名 on 表名A(列名a) 表示給A表的a列創建惟一索引.
若是在表名A(列名a)的括號內添加多列如(列名a,列名b) 就是聯合普通索引,
即 create index 索引名 on 表名A(列名a,列名b) 表示給A 表的a列和b列聯合在一塊兒創建一個普通索引,即聯合普通索引.通常是經過and鏈接起來這兩列進行索引查找的,也能夠只經過a列進行索引查找,可是不能只經過b列進行索引查找.這種現象叫最左前綴匹配. 聯合索引遵循最左前綴匹配,即只要出現最左邊的那一列,就能進行聯合索引查找.
如create index ix_name_Email on userinfo3(name,email,age) 給usrinfo3表中的name,email,age等列創建一個聯合普通索引,
Select * from userinfo3 where name=’alex’;能進行聯合索引
Select * from userinfo3 where name=’alex’ and age=32 ;能進行聯合索引
Select * from userinfo3 where email=’alex@qq.com’ ;不能進行聯合索引,由於沒有name列.
刪除索引:drop index 索引名 on 表名 刪除普通索引
Drop unique index 索引名 on 表名 刪除惟一索引
覆蓋索引:在索引文件中直接獲取數據,即select 的和經過索引查詢的是一樣的內容
Select id from userinfo3 where id >3000;
索引合併:指的是把多個索引聯合起來進行查找,以下,其中name是索引,email也是索引.select * from userinfo3 where name=’alex’ and email=’alex11@qq.com’
注:聯合索引的效率>索引合併的
8.判斷是否走索引的方法(通常正確)
經過explain +select語句,explain的做用是預估其後跟的select語句的查詢快慢.
All <index<range<index_merge<ref_or_null<ref<eq_ref<system/const
Explain select * from userinfo3 where name=’alex’
Type:ALL(全表掃描,即沒走索引)
Type:const(走索引最快,查找的最多有一個匹配行)
Explain 中type =all,表示
Type=const表示
查詢結果中主要看id和type,id中的值表示預估的select語句有幾個,type中的值表示該select語句是否走了索引,通常狀況下,走索引的比沒走索引的快
9.經過創建索引,而後命中索引,就能進行select語句的優化,提升查詢效率.因此在寫查詢語句時,對查詢的語句經過explain預估該查詢語句是否走了索引,而後看看是否犯了沒命中索引的8種狀況,最後對查詢語句進行優化.
10.慢日誌查詢 ,對於慢日誌,要注意三點:1.執行時間>10 2. 未命中索引 3.日誌文件路徑 在mysql中經過show variables like ‘%query%’ 查詢到mysql的當前配置信息,主要看slow_query_log 查看是否開啓慢日誌記錄
Long_query_time 時間限制,查看最長查詢時間,一旦超過此時間,則記錄
Slow_query_log_file 查看慢日誌文件及路徑
經過Show variables like ‘%queries%’查詢是否記錄索引設置信息.
Log_queries_not_using_indexes 是否記錄使用索引進行查詢的狀況
修改當前配置:set global 變量名=值
在配置文件中進行修改(它是在服務端進行的)
Mysqld --defaults-file=’d:\mysql.conf’ 表示按配置文件的內容,啓動mysql服務
在mysql.conf中設置配置信息:
Slow_query_log=on
Slow_query_log_file =
Mysqld --defaults-file=’ D:\Program Files(x86)\mysql\mysql-5.7.16-winx64\my-default.ini’
’ D:\Program Files(x86)\mysql\mysql-5.7.16-winx64\my-default.ini’它是mysql服務端的默認配置文件
注意: 修改配置文件以前,要把配置文件進行備份. 修改配置文件以後,須要重啓服務,即若是對mysql.conf的內容進行修改了,就要重新運行Mysqld --defaults-file=’d:\mysql.conf’
11.分頁 使用limit
1)select * from userinfo3 limit 20,10; 表示從頭掃到20行的位置,而後從它開始取10行顯示;這種從頭開始掃的方式進行分頁效率很低
2)分頁進行優化的方式有,1.不讓看,即有些頁碼掩藏,2.在索引表中掃
在索引表中掃的a.記錄當前頁的最大或最小id
#max_id
#min_id
下一頁:
Select * from userinfo3 where id>max_id limit 10;表示先定位到id的位置.而後從該位置開始取10行
上一頁: select * from userinfo3 where id<min_id order by id desc limit10;表示先定位到id的位置,而後按id倒序排列,在從該位置開始取10行
Select * from userinfo3 where id in(
Select id from (select id from userinfo3 where id>max_id limit30) as n order by n.id desc limit 10)
參考連接