MySQL索引語法+使用場景


MySQL索引語法

建表時添加索引

建表同時建立單索引

CREATE TABLE t_user1(id INT ,
userName VARCHAR(20),
PASSWORD VARCHAR(20),
INDEX (userName) #關鍵字INDEX
);

建表同時建立唯一索引(可以是單或多)

CREATE TABLE t_user2(id INT ,
userName VARCHAR(20),
PASSWORD VARCHAR(20),
UNIQUE INDEX index_userName(userName) #關鍵字UNIQUE和INDEX
);

建表同時建立聯合索引

CREATE TABLE t_user3(id INT ,
userName VARCHAR(20),
PASSWORD VARCHAR(20),
INDEX index_userName_password(userName,PASSWORD)
);

給已存在表添加索引

  • 單列索引
    CREATE INDEX index_userName ON t_user(userName);
  • 唯一索引
    CREATE UNIQUE INDEX index_userName ON t_user(userName);
  • 聯合索引
    CREATE INDEX index_userName_password ON t_user(userName,PASSWORD);

另一種寫法與上面相似 😱 但是有區別

  • 單列索引
    ALTER TABLE t_user ADD INDEX index_userName(userName);

  • 唯一索引
    ALTER TABLE t_user ADD UNIQUE INDEX index_userName(userName);

  • 聯合索引

兩種區別:
1、CREATE INDEX必須提供索引名,對於ALTER TABLE,將會自動創建,如果你不提供;
2、CREATE INDEX一個語句一次只能建立一個索引,ALTER TABLE可以在一個語句建立多個,如:
ALTER TABLE HeadOfState ADD PRIMARY KEY (ID), ADD INDEX (LastName,FirstName);
3、只有ALTER TABLE 才能創建主鍵,ADD INDEX 不能;

ALTER TABLE t_user ADD INDEX index_userName_password(userName,PASSWORD);

刪除索引

DROP INDEX index_userName ON t_user;
DROP INDEX index_userName_password ON t_user;

各種索引的合理使用

  1. 首先要確定優化的目標,在什么樣的業務場景下,表的大小等等。如果表比較小的話,可能都不需要加索引。
  2. 哪些字段可以建索引? 一般都where、order by 或者 group by 后面的字段。
  3. 記錄修改的時候需要維護索引,所以會有開銷,要衡量建索引之后的得與失(空間+維護換時間)。
  4. 比如學生表,可以認為name的重復度比較小,而age的重復度比較大,對於單列索引來說,比較適合建在重讀度低的列上。
  5. 對於select from students where name='張三’and age=18;該中情況下:
    A. name 和 age 各自單獨建立索引:
    一般來說mysql會選擇其中一個索引,name的可能性比較大,因為mysq會統計每個索引上的重復度,選用低重復度的字段。所以不使用age,否則增加太多成本。
    B. name和age的聯合索引:
    這種索引的切合度最好。但是相對單索引來說,維護的成本大,索引數據占用的存儲空間也要更大。
    可是!有必要使用聯合索引嗎?一般沒必要:學校有10000個學生,叫謝春花的會超過5個嗎?5個找一個比建立聯合索引花銷小的多。
  6. 什么情況下使用聯合索引比較好呢? 舉一個例子,大學修課,需要創建一個關系對應表,有2個字段,student_id 和 teacher_id,想要查詢某個老師和某個學生是否存在師生關系。
    一個學生會選50老師,一個老師會帶200個學生
    如果只為student_id建立索引的情況下,經過索引會選出50條記錄,然后在內存中where一下,去除其余的老師。
    相反如果只為teacher_id建立索引,經過索引會選出200條記錄,然后在內存中where一下,去除其余的學生。
    兩種情況都不是最優的,因為使用索引后范圍依然很大,這個時候使用聯合索引最合適,通過索引直接找到對應記錄,差不多提高了一倍效率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM