日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MySql索引原理与使用大全

發布時間:2023/12/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySql索引原理与使用大全 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?? 林炳文Evankaka原創作品。

轉載請注明出處http://blog.csdn.net/evankaka????

一、索引介紹

???? 索引是對數據庫表中一列或多列的值進行排序的一種結構。在關系數據庫中,索引是一種與表有關的數據庫結構。它能夠使相應于表的SQL語句運行得更快。索引的作用相當于圖書的文件夾,能夠依據文件夾中的頁碼高速找到所需的內容。當表中有大量記錄時,若要對表進行查詢。第一種搜索信息方式是全表搜索,是將全部記錄一一取出,和查詢條件進行一一對照,然后返回滿足條件的記錄,這樣做會消耗大量數據庫系統時間。并造成大量磁盤I/O操作;另外一種就是在表中建立索引,然后在索引中找到符合查詢條件的索引值,最后通過保存在索引中的ROWID(相當于頁碼)高速找到表中相應的記錄。


??????? 索引是一個單獨的、物理的數據庫結構。它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引提供指向存儲在表的指定列中的數據值的指針。然后依據您指定的排序順序對這些指針排序。

數據庫使用索引的方式與您使用書籍中的索引的方式非常類似:它搜索索引以找到特定值,然后順指針找到包括該值的行。在數據庫關系圖中,能夠在選定表的“索引/鍵”屬性頁中創建、編輯或刪除每一個索引類型。當保存索引所附加到的表,或保存該表所在的關系圖時,索引將保存在數據庫中。


Mysql索引概述

??????? 全部MySQL列類型能夠被索引。

對相關列使用索引是提高SELECT操作性能的最佳途徑。依據存儲引擎定義每一個表的最大索引數和最大索引長度。全部存儲引擎支持每一個表至少16個索引,總索引長度至少為256字節。大多數存儲引擎有更高的限制。

??????? 在MySQL 5.1中,對于MyISAM和InnoDB表。前綴能夠達到1000字節長。

請注意前綴的限制應以字節為單位進行測量,而CREATE TABLE語句中的前綴長度解釋為字符數。

當為使用多字節字符集的列指定前綴長度時一定要加以考慮。

??????? 還能夠創建FULLTEXT索引。該索引能夠用于全文搜索。僅僅有MyISAM存儲引擎支持FULLTEXT索引。而且僅僅為CHAR、VARCHAR和TEXT列。索引總是對整個列進行。不支持局部(前綴)索引。

也能夠為空間列類型創建索引。僅僅有MyISAM存儲引擎支持空間類型。

空間索引使用R-樹。

默認情況MEMORY(HEAP)存儲引擎使用hash索引。但也支持B-樹索引。

btree索引與hash索引

???????? 對于BTREE和HASH索引,當使用=、<=>、IN、IS NULL或者IS NOT NULL操作符時,關鍵元素與常量值的比較關系相應一個范圍條件。Hash索引另一些其他特征:它們僅僅用于使用=或<=>操作符的等式比較(但非常快)。優化器不能使用hash索引來加速ORDER BY操作。

(該類索引不能用來按順序搜索下一個條目)。

MySQL不能確定在兩個值之間大約有多少行(這被范圍優化器用來確定使用哪個索引)。

假設你將一個MyISAM表改為hash-索引的MEMORY表,會影響一些查詢。僅僅能使用整個keyword來搜索一行。

(用B-樹索引,不論什么keyword的最左面的前綴可用來找到行)。

??????? 對于BTREE索引,當使用>、<、>=、<=、BETWEEN、!=或者<>,或者LIKE 'pattern'(當中 'pattern'不以通配符開始)操作符時,關鍵元素與常量值的比較關系相應一個范圍條件。“常量值”系指:查詢字符串中的常量、同一聯接中的const或system表中的列、無關聯子查詢的結果、全然從前面類型的子表達式組成的表達式。

下面是一些WHERE子句中有范圍條件的查詢的樣例。

下列范圍查詢適用于 btree索引和hash索引:

SELECT * FROM t1???? WHERE key_col = 1???? OR key_col IN (15,18,20);?下列范圍查詢適用于btree索引
SELECT * FROM t1???? WHERE key_col > 1???? AND key_col < 10;
? SELECT * FROM t1???? WHERE key_col LIKE 'ab%'???? OR key_col BETWEEN 'bar' AND 'foo';

Mysql怎樣使用索引

????????? 索引用于高速找出在某個列中有一特定值的行。不使用索引。MySQL必須從第1條記錄開始然后讀完整個表直到找出相關的行。

表越大,花費的時間越多。

假設表中查詢的列有一個索引,MySQL能高速到達一個位置去搜尋到數據文件的中間,沒有必要看全部數據。假設一個表有1000行,這比順序讀取至少快100倍。注意假設你須要訪問大部分行,順序讀取要快得多。由于此時我們避免磁盤搜索。

大多數MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)在B樹中存儲。僅僅是空間列類型的索引使用R-樹,而且MEMORY表還支持hash索引。


二、用法

首先先創建一個表:

CREATE TABLEt_student(STU_ID INT NOT NULL,STU_NAME CHAR(10) NOT NULL,STU_CLASS INT NOT NULL,STU_SEX CHAR(2) NOT NULL,STU_AGE INT NOT NULL,PRIMARY KEY (STU_ID))ENGINE=InnoDB DEFAULT CHARSET=utf8;

1.1 普通索引

創建索引
這是最主要的索引,它沒有不論什么限制。它有下面幾種創建方式:

CREATE INDEX index_id ON t_student(STU_ID);



假設是CHAR,VARCHAR類型。length能夠小于字段實際長度;假設是BLOB和TEXT類型。必須指定 length。
改動表結構

ALTER TABLE t_student ADD INDEX index_name(STU_NAME(4)) ;


創建表的時候直接指定

CREATE TABLEt_student1(STU_ID INT NOT NULL,STU_NAME CHAR(10) NOT NULL,STU_CLASS INT NOT NULL,STU_SEX CHAR(2) NOT NULL,STU_AGE INT NOT NULL,PRIMARY KEY (STU_ID),INDEX index_name (STU_NAME(5)))ENGINE=InnoDB DEFAULT CHARSET=utf8;

刪除索引的語法
DROP INDEX index_id ON t_student; DROP INDEX index_name ON t_student;
結果

1.2、唯一索引

?????? 主鍵就是唯一索引的一種,主鍵要求建表時指定,一般用auto_increment列。keyword是primary key。

它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但同意有空值。

假設是組合索引。則列值的組合必須唯一。

它有下面幾種創建方式:
創建索引



CREATE UNIQUE INDEX indexName ON mytable(username(length)) 改動表結構
ALTER mytable ADD UNIQUE [indexName] ON (username(length)) 創建表的時候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );

1. 3、多列索引

創建索引

CREATE INDEX indexName ON mytable(username1(length),username2(length))

CREATE INDEX index_age_aex ON t_student(STU_AGE,STU_SEX);


改動表結構

ALTER mytable ADD [indexName] ON (username1(length),username2(length)) 創建表的時候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username1(length),username2(length)) ); 多列索引的一個優點。它通過稱為最左前綴(Leftmost Prefixing)的概念體現出來。繼續考慮前面的樣例。如今我們有一個firstname、lastname、age列上的多列索引,我們稱這個索引為fname_lname_age。當搜索條件是下面各種列的組合時,MySQL將使用fname_lname_age索引:
firstname,lastname。age
firstname,lastname
firstname
從另一方面理解,它相當于我們創建了(firstname,lastname,age)、(firstname,lastname)以及(firstname)這些列組合上的索引。下面這些查詢都能夠使用這個fname_lname_age索引:
Select peopleid FROM people Where firstname='Mike' AND lastname='Sullivan' AND age='17';
Select peopleid FROM people Where firstname='Mike' AND lastname='Sullivan';
Select peopleid FROM people Where firstname='Mike';
下面這些查詢不能夠使用這個fname_lname_age索引:
Select peopleid FROM people Where lastname='Sullivan';
Select peopleid FROM people Where age='17';
Select peopleid FROM people Where lastname='Sullivan' AND age='17';


1.4、全文索引

??????? 全文索引(也稱全文檢索)是眼下搜索引擎使用的一種關鍵技術。它能夠利用「分詞技術「等多種算法智能分析出文本文字中keyword詞的頻率及重要性,然后依照一定的算法規則智能地篩選出我們想要的搜索結果。在這里,我們就不追根究底其底層實現原理了,如今我們來看看在MySQL中怎樣創建并使用全文索引。
??????? 在MySQL中,創建全文索引相對照較簡單。比如。我們有一個文章表(article),當中有主鍵ID(id)、文章標題(title)、文章內容(content)三個字段。

如今我們希望能夠在title和content兩個列上創建全文索引。article表及全文索引的創建SQL語句例如以下:
--創建article表

CREATE TABLE article (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200),content TEXT,FULLTEXT (title, content))ENGINE=MyISAM DEFAULT CHARSET=utf8;

看看索引

上面就是在創建表的同一時候建立全文索引的SQL演示樣例。此外,假設我們想要給已經存在的表的指定字段創建全文索引。相同以article表為例,我們能夠使用例如以下SQL語句進行創建:
--給現有的article表的title和content字段創建全文索引
--索引名稱為fulltext_article

ALTER TABLE article ADD FULLTEXT INDEX fulltext_article (title, content)???? 在MySQL中創建全文索引之后。如今就該了解怎樣使用了。我們必須使用特有的語法才干使用全文索引進行查詢。

比如,我們想要在article表的title和content列中全文檢索指定的查詢字符串,能夠例如以下編寫SQL語句:


SELECT * FROM article WHERE MATCH(title, content) AGAINST ('查詢字符串');

注意事項

搜索必須在類型為fulltext的索引列上,match中指定的列必須在fulltext中指定過
僅能應用在表引擎為MyIsam類型的表中(MySQL 5.6以后也能夠用在Innodb表引擎中了)
僅能再char、varchar、text類型的列上面創建全文索引
像普通索引一樣,能夠在定義表時指定,也能夠在創建表后加入或者改動
對于一個大數量級記錄插入。向沒有索引的表中插入數據后創建索引比向有索引的數據表中插入的過程要快非常多
搜索字符串必須是一個常量字符串,不能是表的列名
在搜索記錄的選擇性超過50%的時候。覺得沒有匹配(僅僅在自然搜索中限制)

1.5、驗證是否使用是索引

些處接1.3.這里能夠接上面多列索引,在這里我已經加了一些數據進去,例如以下


能夠用語句 EXPLAIN SELECT * FROM t_student WHERE STU_AGE = 12;來驗證是否使用到了索引

下面說明用到了索引


假設沒用到索引,結果應該是例如以下:


上面僅僅是驗證是否使用了索引,接下來看來看看使用了索引和沒使用索引的結果:

使用了索引的結果:(注意,這里加入了CREATE INDEX index_age_aex ON t_student(STU_AGE,STU_SEX);)

結果按SEX和AGE來進行排序


把索引給刪除了,運行相同的語句:

結果直接按ID進行排序


1.6、使用ALTER 命令加入和刪除索引

有四種方式來加入數據表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句加入一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。

ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句創建索引的值必須是唯一的(除了NULL外。NULL可能會出現多次)。

ALTER TABLE tbl_name ADD INDEX index_name (column_list): 加入普通索引。索引值可出現多次。

ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引為 FULLTEXT 。用于全文索引。

下面實例為在表中加入索引。
ALTER TABLE testalter_tbl ADD INDEX (c);你還能夠在 ALTER 命令中使用 DROP 子句來刪除索引。

嘗試下面實例刪除索引:


ALTER TABLE testalter_tbl DROP INDEX (c);使用 ALTER 命令加入和刪除主鍵
主鍵僅僅能作用于一個列上。加入主鍵索引時,你須要確保該主鍵默認不為空(NOT NULL)。實比例如以下:

ALTER TABLE testalter_tbl MODIFY i INT NOT NULL; ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);你也能夠使用 ALTER 命令刪除主鍵:
ALTER TABLE testalter_tbl DROP PRIMARY KEY;刪除指定時僅僅需指定PRIMARY KEY,但在刪除索引時,你必須知道索引名。
顯示索引信息
你能夠使用 SHOW INDEX 命令來列出表中的相關的索引信息。

能夠通過加入 \G 來格式化輸出信息。
嘗試下面實例:


SHOW INDEX FROM table_name\G

三、索引的不足之處

上面都在說使用索引的優點,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:

1.盡管索引大大提高了查詢速度,同一時候卻會減少更新表的速度,如對表進行INSERT、UPDATE和DELETE。

由于更新表時,MySQL不僅要保存數據,還要保存一下索引文件。

2.建立索引會占用磁盤空間的索引文件。

普通情況這個問題不太嚴重,但假設你在一個大表上創建了多種組合索引。索引文件的會膨脹非常快。

索引僅僅是提高效率的一個因素,假設你的MySQL有大數據量的表。就須要花時間研究建立最棒的索引,或優化查詢語句。

四、使用索引的注意事項

使用索引時,有下面一些技巧和注意事項:

1.索引不會包括有NULL值的列

僅僅要列中包括有NULL值都將不會被包括在索引中。復合索引中僅僅要有一列含有NULL值,那么這一列對于此復合索引就是無效的。所以我們在數據庫設計時不要讓字段的默認值為NULL。

2.使用短索引

對串列進行索引,假設可能應該指定一個前綴長度。比如。假設有一個CHAR(255)的列。假設在前10個或20個字符內,多數值是惟一的,那么就不要對整個列進行索引。短索引不僅能夠提高查詢速度而且能夠節省磁盤空間和I/O操作。

3.索引列排序

MySQL查詢僅僅使用一個索引。因此假設where子句中已經使用了索引的話,那么order by中的列是不會使用索引的。

因此數據庫默認排序能夠符合要求的情況下不要使用排序操作;盡量不要包括多個列的排序,假設須要最好給這些列創建復合索引。

4.like語句操作

普通情況下不鼓舞使用like操作,假設非使用不可,怎樣使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”能夠使用索引。

5.不要在列上進行運算

select * from users where YEAR(adddate)<2007;

將在每一個行上進行運算,這將導致索引失效而進行全表掃描。因此我們能夠改成:

select * from users where adddate<‘2007-01-01';

6.不使用NOT IN和<>操作



轉載于:https://www.cnblogs.com/mengfanrong/p/5233692.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的MySql索引原理与使用大全的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。