mysql的索引內容

1.索引的做用主要是加速查找html

2.索引的的分類有幾類分別爲主鍵索引,惟一索引,普通索引和聯合索引mysql

主鍵索引:主要是主鍵的做用,主鍵不能爲空且不能重複,最後有加速查找的功能sql

惟一索引:它分爲兩部分,一個是惟一約束,一個是索引,數據結構

普通索引:它就是加速查找,對數據沒有什麼要求,函數

聯合索引:把多列組合成一個總體,看成一個索引,通常狀況下都是聯合主鍵,聯合惟一和聯合普通索引(把多列組合在一塊兒設置它們爲一個普通索引,叫聯合普通索引)優化

3.索引能加速查找的然因是一旦創建索引,它就會自動建立一個額外文件(某種格式存儲),而後在進行索引查找時,先在該文件中找到要的信息,而後根據select要顯示的內容,在要查詢表中尋找信息.而若是沒有索引,它會從頭至尾依次查找一遍.因此索引能節省時間.可是創建了索引,在對錶進行增刪改的時候,就有些浪費時間了,由於對錶進行操做時,還要對相應的額外文件進行操做.日誌

4.建立額外文件中的格式存儲方式分爲hash索引和btree索引.默認是btree索引的型式存儲的.htm

hash索引:它通常在單值查詢的時候很快,在範圍查詢的時候很慢,緣由是hash索引是無序的.hash索引的存儲結構是有兩列,一列放hash值,一列放該hash對於表中索引值所在的存儲位置(或是存儲路徑)blog

btree索引:它是以二叉樹結構存儲的數據結構.以下圖排序

 

  1. 索引的創建和刪除:

 

創建索引: 形如  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  表名   刪除惟一索引

  1. 索引中的兩個索引名稱:覆蓋索引和索引合併.

覆蓋索引:在索引文件中直接獲取數據,即select  的和經過索引查詢的是一樣的內容

Select  id   from userinfo3  where  id >3000;

索引合併:指的是把多個索引聯合起來進行查找,以下,其中name是索引,email也是索引.select   * from userinfo3 where  name=’alex’   and email=’alex11@qq.com’

注:聯合索引的效率>索引合併的

  1. 對應要進行頻繁查找的列,應該創建索引,而後進行索引查詢.在進行索引查詢時,只有命中索引才能進行索引查詢.有如下幾種狀況是不能命中索引的
    1. Like  ‘%xx’  模糊匹配不能進行索引查詢,咱們應該導入第三方模塊進行
    2. 使用函數,在where條件中對索引列進行使用函數,也不能進行索引查詢
    3. 有or  的狀況 如  select * from   t1   where   id  =1 or  name =’alex’  name不是索引,因此不能進行索引查找
    4. 類型不一致,如列是字符串類型,可是判斷條件的值不是字符串類型,也不能進行索引查詢
    5. !=   在條件判斷中出現!=時,不走索引,可是主鍵例外
    6. >或<  在條件判斷中出現<或>時,也不走索引,可是當主鍵或索引是整數類型時,能夠走索引
    7. Order   by  通常狀況下出現order  by的時候不走索引,可是當對索引排序時進行索引覆蓋走索引,若是是對主鍵排序,則走索引
    8. 聯合索引(組合索引)最左前綴

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

  1. 頁面只有上一頁,下一頁

#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行

  1. 上一頁   193  194  195  [196]   197  198   199   下一頁,當前頁碼是196,若是選擇199頁碼,則sql語句是:

       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)

 

參考連接

http://www.cnblogs.com/wupeiqi/articles/5716963.html

相關文章
相關標籤/搜索