A、索引的基本操做mysql
1、概念算法
1)、查看索引 show index from 數據庫表名 sql
2)、alter table 數據庫表 add index 索引名稱(數據庫表字段名稱)數據庫
2、索引類型:性能優化
1)、PRIMARY KEY(主鍵索引) 數據結構
ALTER TABLE table_name ADD PRIMARY KEY ( column )函數
2)、UNIQUE(惟一索引) 性能
ALTER TABLE table_name ADD UNIQUE (column)大數據
3)、INDEX(普通索引) 優化
ALTER TABLE table_name ADD INDEX index_name ( column )
4)、FULLTEXT(全文索引)
ALTER TABLE table_name ADD FULLTEXT ( column )
5)、多列索引
ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )
3、操做
1).普通索引。
這是最基本的索引,它沒有任何限制。它有如下幾種建立方式:
(1)建立索引:
CREATE INDEX indexName ON tableName(tableColumns(length));
若是是CHAR,VARCHAR類型,length能夠小於字段實際長度;若是是BLOB 和 TEXT 類型,必須指定length,下同。
(2)修改表結構:
ALTER tableName ADD INDEX [indexName] ON (tableColumns(length))
(3)建立表的時候直接指定:
CREATE TABLE tableName ( […], INDEX [indexName] (tableColumns(length)) ;
2).惟一索引。
它與前面的」普通索引」相似,不一樣的就是:索引列的值必須惟一,但容許有空值。若是是組合索引,則列值的組合必須惟一。它有如下幾種建立方式:
(1)建立索引:
CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
(2)修改表結構:
ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
(3)建立表的時候直接指定:
CREATE TABLE tableName ( […], UNIQUE [indexName] (tableColumns(length));
3).主鍵索引
它是一種特殊的惟一索引,不容許有空值。通常是在建表的時候同時建立主鍵索引:
CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 固然也能夠用ALTER命令。
B、索引的原理及案例
如圖所示,若是要查找數據項29,那麼首先會把磁盤塊1由磁盤加載到內存,此時發生一次IO,在內存中用二分查找肯定29在17和35之間,鎖定磁盤塊1的P2指針,內存時間由於很是短(相比磁盤的IO)能夠忽略不計,經過磁盤塊1的P2指針的磁盤地址把磁盤塊3由磁盤加載到內存,發生第二次IO,29在26和30之間,鎖定磁盤塊3的P2指針,經過指針加載磁盤塊8到內存,發生第三次IO,同時內存中作二分查找找到29,結束查詢,總計三次IO。真實的狀況是,3層的B-tree能夠表示上百萬的數據,若是上百萬的數據查找只須要三次IO,性能提升將是巨大的,若是沒有索引,每一個數據項都要發生一次IO,那麼總共須要百萬次的IO,顯然成本很是很是高。
注意:B-tree的高度通常都在2-4層,這也就是說查找某一鍵值的行記錄最多隻要2到4次IO,花費0.02-0.04秒左右。B-tree索引適用於全值匹配、匹配最左前綴、匹配列前綴、匹配範圍值
數據表以下,
數據量:
咱們經過explain查看執行計劃
首先咱們在沒有添加索引時,進行以下查詢。咱們能夠看出type=all代表全表掃描,估計查詢行數爲4070行。
咱們經過explain查看執行計劃
首先咱們在沒有添加索引時,進行以下查詢。咱們能夠看出type=all代表全表掃描,估計查詢行數爲4070行。
如今咱們添加索引以下,
在經過explain查詢執行計劃,咱們發現該查詢的行數估計爲1行。
Mysql中只有在memory引擎顯示支持哈希索引。
哈希索引基於哈希表實現,只有精確匹配索引全部列的列纔有效。 對於每一行數據,存儲引擎都會對全部索引計算一個哈希碼,哈希碼是一個較小的值而且不一樣鍵值計算出來的哈希碼都不同。哈希索引將全部的哈希碼存儲在索引中,同時在哈希表中保存指向每一個數據的指針。
哈希索引的限制:
注意:Innodb引擎有一個特殊的功能叫作「自適應哈希索引」。當Innodb注意到某些索引值使用很是頻繁時,它會在內存中基於B-tree索引之上再創建一個哈希索引。這是一個徹底自動、內部的行爲,用戶沒法配置或者設置,不過有必要能夠關閉此功能。
思路:在B-tree基礎上建立一個僞哈希索引。這和真正的哈希索引不是一回事,它使用哈希值而不是鍵自己經行查找。須要在操做中在where語句中手動指定哈希函數。
其中,url_crc用來存儲哈希值。該值根據url和哈希函數得出。
咱們經過觸發器來實現維護哈希值。
若是採用這種方式,記住不要使用SHA1()和MD5()做爲哈希函數。由於這兩個值計算出來的哈希值是很是長的字符串,會浪費大量時間,比較時也會比較慢。
在出現哈希衝突時,必須在子句中包含常量值。
與普通索引相似,不一樣的就是:索引列的值必須惟一,但容許有空值(注意和主鍵不一樣)。若是是組合索引,則列值的組合必須惟一。
例如,在已經存好數據的表中添加惟一索引,若是值有重複會報錯,
它是一種特殊的惟一索引,不容許有空值。
平時用的SQL查詢語句通常都有比較多的限制條件,因此爲了進一步榨取MySQL的效率,就要考慮創建組合索引。
至關於同時建立了三個索引,
(ConutryCode,District,Name),(CountryCode,District),(CountryCode)。
這是由於從最左開始組合的。因此依次生成了三個索引。
在前面描述中,在B-tree中能夠經過列前綴進行查詢。例如
select * from testwhere body=」hello%」;
然而,咱們更廣泛的查找方式是,
select * from testwhere body=」%hello%」;
全文索引能夠支持各類字符在內的搜索,也支持天然語言搜索和布爾搜索。
注意,在innodb存儲引擎中爲了支持全文索引,必須有一列與word經行映射。在Innodb中這個列別命名爲FTS_DOC_ID,其類型必須是BIGINT UNSIGNED NOT NULL,而且innodb存儲引擎自動會在該列上加入一個名爲FTS_DOC_ID_INDEX的unique index。上述操做都是由Innodb存儲引擎本身完成的,用戶也可在建表時手動添加FTS_DOC_ID以及相應的Unique idnex。
mysql> create fulltext index idx on fts(body);
能夠看出每個word都對應一個DOC_ID和POSITION。此外還記錄了FIRST_ID,LAST_DOC_ID以及DOC_COUNT,分別表明了word第一次出現的文檔ID,最後一次出現的文檔ID,以及word在在多少個文檔中存在。
天然語言索引引擎將計算每個文檔對象和查詢的相關度。這裏,相關度是指基於匹配的關鍵詞個數,以及關鍵詞在文檔中出現的個數。
天然語言索引是默認的。
函數match()將返回關鍵詞匹配的相關度,是一個浮點數字。
在match()中指定的列必須和全文索引中指定的列徹底相同,不然沒法只用全文索引。
舉例子,
Mysql數據庫容許使用in boolen model修飾符來經行全文檢索。當使用該修飾符時,查詢字符串先後字符會有特殊含義。
Boolen全文檢索支持如下幾種操做符:
l +:表示word必須存在
l -:表示word必須不存在
l (no operator) 表示word是可選的。可是若是是可選的,其相關性會更高。
l @distance表示查詢的多個單詞之間的距離是否在distance以內。
2 rows in set(0.00 sec)
l >表示出現該word增長相關性
l <表示出現該word下降相關性
l ~容許出現該單詞,可是出現時相關性爲負。
l 表示以該單詞開頭的單詞,如lik,表示能夠是like,likes和lik
---------------+2 rows in set(0.00 sec)
l 「表示短語
注意到,第一個against(「hello world「)是將hello和world看成兩個單詞經行查詢。而第二個against(‘」hello world「’)是將這兩個單詞看成短語經行查詢。
普通索引:最基本的索引,沒有任何限制
惟一索引:與"普通索引"相似,不一樣的就是:索引列的值必須惟一,但容許有空值。
主鍵索引:它是一種特殊的惟一索引,不容許有空值。
全文索引:針對較大的數據,生成全文索引很耗時好空間。
組合索引:爲了更多的提升mysql效率可創建組合索引,遵循」最左前綴「原則。