国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

MySQL的索引文件介紹

2009-12-14 14:21:14 7500



[1]索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個(gè)組成部分),它們包含著(zhù)對數據表里所有記錄的引用指針。索引不是萬(wàn)能的,索引可以加快數據檢索操作,但會(huì )使數據修改操作變慢。每修改數據記錄,索引就必須刷新一次。為了在某種程序上彌補這一缺陷,許多SQL命令都有一個(gè)DELAY_KEY_WRITE項。這個(gè)選項的作用是暫時(shí)制止MySQL在該命令每插入一條新記錄和每修改一條現有之后立刻對索引進(jìn)行刷新,對索引的刷新將等到全部記錄插入/修改完畢之后再進(jìn)行。在需要把許多新記錄插入某個(gè)數據表的場(chǎng)合,DELAY_KEY_WRITE選項的作用將非常明顯。另外,索引還會(huì )在硬盤(pán)上占用相當大的空間。因此應該只為最經(jīng)常查詢(xún)和最經(jīng)常排序的數據列建立索引。注意,如果某個(gè)數據列包含許多重復的內容,為它建立索引就沒(méi)有太大的實(shí)際效果。
  從理論上講,完全可以為數據表里的每個(gè)字段分別建一個(gè)索引,但MySQL把同一個(gè)數據表里的索引總數限制為16個(gè)。
  1、InnoDB數據表的索引
  與InnoDB數據表相比,在InnoDB數據表上,索引對InnoDB數據表的重要性要在得多。在InnoDB數據表上,索引不僅會(huì )在搜索數據記錄時(shí)發(fā)揮作用,還是數據行級鎖定機制的苊、基礎?!皵祿屑夋i定”的意思是指在事務(wù)操作的執行過(guò)程中鎖定正在被處理的個(gè)別記錄,不讓其他用戶(hù)進(jìn)行訪(fǎng)問(wèn)。這種鎖定將影響到(但不限于)SELECT、LOCKINSHAREMODE、SELECT、FORUPDATE命令以及INSERT、UPDATE和DELETE命令。出于效率方面的考慮,InnoDB數據表的數據行級鎖定實(shí)際發(fā)生在它們的索引上,而不是數據表自身上。顯然,數據行級鎖定機制只有在有關(guān)的數據表有一個(gè)合適的索引可供鎖定的時(shí)候才能發(fā)揮效力。
  2、限制
  如果WEHERE子句的查詢(xún)條件里有不等號(WHEREcoloum!=),MySQL將無(wú)法使用索引。類(lèi)似地,如果WHERE子句的查詢(xún)條件里使用了函數(WHEREDAY(column)=),MySQL也將無(wú)法使用索引。在JOIN操作中(需要從多個(gè)數據表提取數據時(shí)),MySQL只有在主鍵和外鍵的數據類(lèi)型相同時(shí)才能使用索引。
  如果WHERE子句的查詢(xún)條件里使用比較操作符LIKE和REGEXP,MySQL只有在搜索模板的第一個(gè)字符不是通配符的情況下才能使用索引。比如說(shuō),如果查詢(xún)條件是LIKEabc%‘,MySQL將使用索引;如果查詢(xún)條件是LIKE%abc’,MySQL將不使用索引。
  在ORDERBY操作中,MySQL只有在排序條件不是一個(gè)查詢(xún)條件表達式的情況下才使用索引。(雖然如此,在涉及多個(gè)數據表查詢(xún)里,即使有索引可用,那些索引在加快ORDERBY方面也沒(méi)什么作用)。如果某個(gè)數據列里包含許多重復的值,就算為它建立了索引也不會(huì )有很好的效果。比如說(shuō),如果某個(gè)數據列里包含的凈是些諸如“0/1”或“Y/N”等值,就沒(méi)有必要為它創(chuàng )建一個(gè)索引。
  MySQL 普通索引、唯一索引和主索引
  1、普通索引
  普通索引(由關(guān)鍵字KEY或INDEX定義的索引)的唯一任務(wù)是加快對數據的訪(fǎng)問(wèn)速度。因此,應該只為那些最經(jīng)常出現在查詢(xún)條件(WHEREcolumn=)或排序條件(ORDERBYcolumn)中的數據列創(chuàng )建索引。只要有可能,就應該選擇一個(gè)數據最整齊、最緊湊的數據列(如一個(gè)整數類(lèi)型的數據列)來(lái)創(chuàng )建索引。
  2、唯一索引
  普通索引允許被索引的數據列包含重復的值。比如說(shuō),因為人有可能同名,所以同一個(gè)姓名在同一個(gè)“員工個(gè)人資料”數據表里可能出現兩次或更多次。
  如果能確定某個(gè)數據列將只包含彼此各不相同的值,在為這個(gè)數據列創(chuàng )建索引的時(shí)候就應該用關(guān)鍵字UNIQUE把它定義為一個(gè)唯一索引。這么做的好處:一是簡(jiǎn)化了MySQL對這個(gè)索引的管理工作,這個(gè)索引也因此而變得更有效率;二是MySQL會(huì )在有新記錄插入數據表時(shí),自動(dòng)檢查新記錄的這個(gè)字段的值是否已經(jīng)在某個(gè)記錄的這個(gè)字段里出現過(guò)了;如果是,MySQL將拒絕插入那條新記錄。也就是說(shuō),唯一索引可以保證數據記錄的唯一性。事實(shí)上,在許多場(chǎng)合,人們創(chuàng )建唯一索引的目的往往不是為了提高訪(fǎng)問(wèn)速度,而只是為了避免數據出現重復。
  3、主索引
  在前面已經(jīng)反復多次強調過(guò):必須為主鍵字段創(chuàng )建一個(gè)索引,這個(gè)索引就是所謂的“主索引”。主索引與唯一索引的唯一區別是:前者在定義時(shí)使用的關(guān)鍵字是PRIMARY而不是UNIQUE。
  4、外鍵索引
  如果為某個(gè)外鍵字段定義了一個(gè)外鍵約束條件,MySQL就會(huì )定義一個(gè)內部索引來(lái)幫助自己以最有效率的方式去管理和使用外鍵約束條件。
  5、復合索引
  索引可以覆蓋多個(gè)數據列,如像INDEX(columnA,columnB)索引。這種索引的特點(diǎn)是MySQL可以有選擇地使用一個(gè)這樣的索引。如果查詢(xún)操作只需要用到columnA數據列上的一個(gè)索引,就可以使用復合索引INDEX(columnA,columnB)。不過(guò),這種用法僅適用于在復合索引中排列在前的數據列組合。比如說(shuō),INDEX(A,B,C)可以當做A或(A,B)的索引來(lái)使用,但不能當做B、C或(B,C)的索引來(lái)使用。
  6、索引的長(cháng)度
  在為CHAR和VARCHAR類(lèi)型的數據列定義索引時(shí),可以把索引的長(cháng)度限制為一個(gè)給定的字符個(gè)數(這個(gè)數字必須小于這個(gè)字段所允許的最大字符個(gè)數)。這么做的好處是可以生成一個(gè)尺寸比較小、檢索速度卻比較快的索引文件。在絕大多數應用里,數據庫中的字符串數據大都以各種各樣的名字為主,把索引的長(cháng)度設置為10~15個(gè)字符已經(jīng)足以把搜索范圍縮小到很少的幾條數據記錄了。在為BLOB和TEXT類(lèi)型的數據列創(chuàng )建索引時(shí),必須對索引的長(cháng)度做出限制;MySQL所允許的最大索引全文索引文本字段上的普通索引只能加快對出現在字段內容最前面的字符串(也就是字段內容開(kāi)頭的字符)進(jìn)行檢索操作。如果字段里存放的是由幾個(gè)、甚至是多個(gè)單詞構成的較大段文字,普通索引就沒(méi)什么作用了。這種檢索往往以的形式出現,這對MySQL來(lái)說(shuō)很復雜,如果需要處理的數據量很大,響應時(shí)間就會(huì )很長(cháng)。
  這類(lèi)場(chǎng)合正是全文索引(full-textindex)可以大顯身手的地方。在生成這種類(lèi)型的索引時(shí),MySQL將把在文本中出現的所有單詞創(chuàng )建為一份清單,查詢(xún)操作將根據這份清單去檢索有關(guān)的數據記錄。全文索引即可以隨數據表一同創(chuàng )建,也可以等日后有必要時(shí)再使用下面這條命令添加:
  ALTERTABLEtablenameADDFULLTEXT(column1,column2)有了全文索引,就可以用SELECT查詢(xún)命令去檢索那些包含著(zhù)一個(gè)或多個(gè)給定單詞的數據記錄了。下面是這類(lèi)查詢(xún)命令的基本語(yǔ)法:
  SELECT*FROMtablename
  WHEREMATCH(column1,column2)AGAINST(‘word1,word2,word3’)
  上面這條命令將把column1和column2字段里有word1、word2和word3的數據記錄全部查詢(xún)出來(lái)。
  注解:InnoDB數據表不支持全文索引。

提交成功!非常感謝您的反饋,我們會(huì )繼續努力做到更好!

這條文檔是否有幫助解決問(wèn)題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問(wèn)題:
-->