1. 什麼是索引
索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊.sql索引在資料庫優化中佔非常大的比例,乙個好的索引設計,可以讓你的效率提高幾十甚至幾百倍.
2. 深入淺出理解索引
其實,我們的漢語字典的正文本身就是乙個聚集索引。比如,我們要查「安」字,就會很自然地翻開字典的前幾頁,因為「安」的拼音是「an」,而按照拼音排序漢字的字典是以英文本母「a」開頭並以「z」結尾的,那麼「安」字就自然地排在字典的前部。如果您翻完了所有以「a」開頭的部分仍然找不到這個字,那麼就說明您的字典中沒有這個字;同樣的,如果查「張」字,那您也會將您的字典翻到最後部分,因為「張」的拼音是「zhang」。也就是說,字典的正文部分本身就是乙個目錄,您不需要再去查其他目錄來找到您需要找的內容。我們把這種正文內容本身就是一種按照一定規則排列的目錄稱為「聚集索引」。
如果您認識某個字,您可以快速地從自動中查到這個字。但您也可能會遇到您不認識的字,不知道它的發音,這時候,您就不能按照剛才的方法找到您要查的字,而需要去根據「偏旁部首」查到您要找的字,然後根據這個字後的頁碼直接翻到某頁來找到您要找的字。但您結合「部首目錄」和「檢字表」而查到的字的排序並不是真正的正文的排序方法,比如您查「張」字,我們可以看到在查部首之後的檢字表中「張」的頁碼是672頁,檢字表中「張」的上面是「馳」字,但頁碼卻是63頁,「張」的下面是「弩」字,頁面是390頁。很顯然,這些字並不是真正的分別位於「張」字的上下方,現在您看到的連續的「馳、張、弩」三字實際上就是他們在非聚集索引中的排序,是字典正文中的字在非聚集索引中的對映。我們可以通過這種方式來找到您所需要的字,但它需要兩個過程,先找到目錄中的結果,然後再翻到您所需要的頁碼。我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為「非聚集索引」。
通過以上例子,我們可以理解到什麼是「聚集索引」和「非聚集索引」。進一步引申一下,我們可以很容易的理解:每個表只能有乙個聚集索引,因為目錄只能按照一種方法進行排序。
3. 索引的優缺點
優點可以通過建立唯一索引或者主鍵索引 , 保證資料庫表中每一行資料的唯一性
建立索引可以大大提高檢索的資料 , 以及減少表的檢索行數
在表連線的連線調節,可以加速表語表直接的相連
在分組和排序字句進行檢索 , 可以減少查詢時間中分組和排序所消耗的時間(資料庫的記錄會重新排序)
建立索引 , 在查詢中使用索引 , 可以提高效能.
優勢總結: 可以快速檢索,減少i/o次數,加快檢索速度;根據索引分組和排序,可以加快分組和排序.
劣勢在建立索引和維護索引 , 會耗費時間 , 隨著資料量的增加而增加
索引檔案會占用物理空間 , 除了表需要占用物理空間外 , 每個索引還會占用一定的物理空間
當對表的資料進行 insert , update , delete 的時候 , 索引也要動態的維護 , 這樣就降低資料的維護速速,(建立索引會占用磁碟空間的索引檔案 , 一般情況下這個問題太嚴重 , 但如果你在乙個大表上建立了多種組合索引 , 索引檔案會膨脹很快).
劣勢總結: 索引本身也是表,因此會占用儲存空間,一般來說,索引表占用的空間是資料庫表的1.5倍;索引表的維護和建立需要時間成本,這個成本隨著資料量增大而增大;構建索引會降低資料表的修改操作(刪除,新增,修改)的效率,因為在修改資料表的同事還需要修改索引表.
4. 索引分類
按資料存放的物理為止順序劃分 :聚簇索引
非聚簇索引
按資料庫的功能 劃分:唯一索引
主鍵索引
聚集索引
4.1 主鍵索引主鍵索引(建立表時新增)create table primary_key ( id int unsigned comment '無符號' primary key auto_increment
1.2 主鍵索引(建表後新增)alter table 表名 add primary key (列名);
注: 下面的示例 table_name 是表名 , col是列名
4.2 唯一索引
用來建立索引的列的值必須是唯一的,允許空值alter table 'table_name' add unique('col');
4.3 普通索引
用表中的普通列構建的索引 , 沒有任何限制alter table 'table_name' add index index_name('col');
4.4 全文索引
用大文字物件的列構建的索引alter table 'table_name' add fulltext('col');
4.5 組合索引
用多個列組合構建的索引 , 這多個列中的值不允許有空值alter table 'table_name' add index index_name('col1','col2','col3');*遵循「最左字首」原則,把最常用作為檢索或排序的列放在最左,依次遞減,組合索引相當於建立了col1,col1col2,col1col2col3三個索引,而col2或者col3是不能使用索引的。
*在使用組合索引的時候可能因為列名長度過長而導致索引的key太大,導致效率降低,在允許的情況下,可以只取col1和col2的前幾個字元作為索引alter table 'table_name' add index index_name(col1(4),col2(3));
# 表示使用col1的前4個字元和col2的前3個字元作為索引
5. mysql中索引的語法
建立索引在建表的時候新增索引create table tablename(id int(10) primary key,content text,name char(10) not null,
[unique] index name_index (name(4)))engion myisam default charse utf8;
在建立表以後新增索引alter my_table add [unique] index my_index(my_text);create index my_index on my_table(my_text);
根據索引查詢select * from tablename where match(content) against('word1','word2',...);
刪除索引drop my_index on tablename;
檢視表中的索引show index from tablename;
6. 使用索引的原則
什麼情況下要使用索引主鍵自動建立唯一索引
經常作為查詢調節在where 或者order by 語句**現的列要建立索引
作為排序的列要建立索引
查詢中與其他表關聯的字段 , 外來鍵關係建立索引
高併發條件下傾向組合索引
說明時候不要使用索引經常增刪的列不要建立索引
有大量重複的列不需要建立索引
表記錄太少不需要建立索引
mysql 部分索引 mysql建立部分索引
mysql中,字串如何建立索引的 本文中擷取一部分 只對字串的前幾個字元進行索引。通過字串的前幾個字元我們已經能大概排序字串了,剩下不能排序的可以通過遍歷進行查詢啊,這樣只在b 樹中儲存字串的前幾個字元的編碼,既節約空間,又減少了字串的比較時間,還大概能解決排序的問題,何樂而不為,比方說我們在建表語...
字典序 MySQL索引
1.求字典序在s1和s2之間的,長度在len1到len2的字串的個數,結果mod 1000007。藉此題寫了一些字典序的問題。public static void getres string str 用於求出字典序小於某乙個字串的字串個數 long sum 0 int len str.length ...
MySQL表字段加索引
新增普通索引 此時key型別為mul alter table table name add index column column 例如 alter table poicity add index delete flag delete flag 新增主鍵索引 primary key alter ta...