Mysql 查詢資料慢,加入索引

2021-06-22 03:34:41 字數 3270 閱讀 4743

1. 索引操作***

在執行create table語句時可以建立索引,也可以單獨用create index或alter table來為表增加索引。

1.alter table

alter table用來建立普通索引、unique索引或primary key索引。

alter table table_name add index index_name (column_list)

alter table table_name add unique (column_list)

alter table table_name add primary key (column_list)

其中table_name是要增加索引的表名,column_list指出對哪些列進行索引,多列時各列之間用逗號分隔。索引名index_name可選,預設時,mysql將根據第乙個索引列賦乙個名稱。另外,alter table允許在單個語句中更改多個表,因此可以在同時建立多個索引。

2.create index

create index可對表增加普通索引或unique索引。

create index index_name on table_name (column_list)

create unique index index_name on table_name (column_list)

table_name、index_name和column_list具有與alter table語句中相同的含義,索引名不可選。另外,不能用create index語句建立primary key索引。

3.索引型別

在建立索引時,可以規定索引能否包含重複值。如果不包含,則索引應該建立為primary key或unique索引。對於單列惟一性索引,這保證單列不包含重複的值。對於多列惟一性索引,保證多個值的組合不重複。

primary key索引和unique索引非常類似。事實上,primary key索引僅是乙個具有名稱primary的unique索引。這表示乙個表只能包含乙個primary key,因為乙個表中不可能具有兩個同名的索引。

下面的sql語句對students表在sid上新增primary key索引。

alter table students add primary key (sid)

可利用alter table或drop index語句來刪除索引。類似於create index語句,drop index可以在alter table內部作為一條語句處理,語法如下。

drop index index_name on talbe_name

alter table table_name drop index index_name

alter table table_name drop primary key

其中,前兩條語句是等價的,刪除掉table_name中的索引index_name。

第3條語句只在刪除primary key索引時使用,因為乙個表只可能有乙個primary key索引,因此不需要指定索引名。如果沒有建立primary key索引,但表具有乙個或多個unique索引,則mysql將刪除第乙個unique索引。

如果從表中刪除了某列,則索引會受到影響。對於多列組合的索引,如果刪除其中的某列,則該列也會從索引中刪除。如果刪除組成索引的所有列,則整個索引將被刪除。

2. 索引理解

***

專案中,發現經常有人弄錯索引,不是沒有命中索引,就是建了一堆多餘的索引浪費空間。 對於索引,只有正確理解後才能正確使用。

以下幾個問題,如果能快速回答,請略過。

表a, 字段:  id(自增id),user(使用者名稱),pass(密碼),type(型別 0,1),

索引: user + pass 建立聯合索引 ,user唯一索引,pass普通索引 ,type 普通索引

1 、sql:  select   *   from   a  where user = 'terry'  and pass = 'nndhsbd1243ac' 

會命中哪個索引? 

2、sql:  select   *   from   a  where user = 'terry'  or   user= 'frank' 

會命中哪個索引?  

3、sql:  select   *   from   a  where user = 'terry'

會命中哪個索引?  

4、sql:  select   *   from   a  where pass = 'ssssssssss'    會命中哪個索引?

5、哪些索引是多餘的

6、select   *   from   a  where user = 'terry'  or   user= 'frank'   與 select   user,pass  from   a  where user = 'terry'  or   user= 'frank'  哪個快,為什麼?

7、select * from a where length(user) = 3 能命中索引嗎?

1、user+pass的聯合索引,2、不能命中任何索引,3、user唯一索引   4、不能命中任何索引   5、user唯一索引 、type索引可以刪除

6、後者更快,因為符合索引覆蓋,減少了io .  7 不能。索引列需要隔離

為什麼?

索引就是排序,目前的計算機技術和數學理論還不支援一次同時按照兩個關鍵字進行排序,即使是聯合索引,也是先按照最左邊的關鍵字先排,然後在左邊的關鍵字排序基礎上再對其他的關鍵字排序,是乙個多次排序的結果。 所以,單錶查詢,

一次最多只能命中乙個索引,並且索引必須遵守最左字首 。  可以想象字典的拼音目錄,他是典型的索引,先按照首字母,然後按次字母排序。如果你知道首字母可以很快查詢到,但是如果只知道最後乙個字母,你仍然需要遍歷全表。這就是最左字首的通俗理論。於是基於索引的結構和最左字首,像 or , like '%%'  ,都是不能命中索引的,而 like 'aa%'則是可以命中的。

無論是innodb還是myisam,索引只記錄被排序的行的主鍵或者位址,其他的字段還是需要二次查詢,因此,如果查詢的字段剛好只是包含在索引中,那麼索引覆蓋將是高效的。

盡然是排序,那麼需要考慮選擇性,如果所有的資料都一樣,或者基本一樣,那麼就沒有排序的必要了。像例子中的type只有1或者0,選擇性是0.5,極低的樣紙,所以可以忽視,即使建立了,也是浪費空間,mysql在查詢的時候也會選擇丟棄。

類似最左字首,查詢索引的時候,如果列被應用了函式,那麼在查詢的時候,是不會用到索引的。道理很簡單,函式運算已經改變了列的內容,而原始的索引是對列內容全量排序的。

綜上所述,索引的幾個知識點:最左字首,索引覆蓋,索引選擇性,列隔離在建立和使用索引的時候需要格外注意。

mysql 慢查詢 MySQL慢查詢

一 簡介 開啟慢查詢日誌,可以讓mysql記錄下查詢超過指定時間的語句,通過定位分析效能的瓶頸,才能更好的優化資料庫系統的效能。二 引數說明 slow query log 慢查詢開啟狀態 slow query log file 慢查詢日誌存放的位置 這個目錄需要mysql的執行帳號的可寫許可權,一般...

雲資料庫mysql 慢查詢 Mysql慢查詢

一 簡介 開啟慢查詢日誌,可以讓mysql記錄下查詢超過指定時間的語句,通過定位分析效能的瓶頸,才能更好的優化資料庫系統的效能。二 引數說明 slow query log 慢查詢開啟狀態 slow query log file 慢查詢日誌存放的位置 這個目錄需要mysql的執行帳號的可寫許可權,一般...

MySQL索引原理與慢查詢優化

索引的目的在於提高查詢效率,可以模擬字典,如果要查 mysql 這個單詞,我們肯定需要定位到m字母,然後從下往下找到y字母,再找到剩下的sql。如果沒有索引,那麼你可能需要把所有單詞看一遍才能找到你想要的,如果我想找到m開頭的單詞呢?或者w開頭的單詞呢?是不是覺得如果沒有索引,這個事情根本無法完成?...