當前位置:菜譜大全網 - 菜譜 - 如何正確建立MYSQL數據庫索引

如何正確建立MYSQL數據庫索引

索引是快速搜索的關鍵。MySQL索引的建立對於MySQL的高效運行非常重要。下面是壹些常見的MySQL索引類型。

在數據庫表中,索引字段可以大大提高查詢速度。假設我們創建了壹個mytable表:

創建表mytable( ID INT NOT NULL,用戶名VARCHAR(16)NOT NULL);我們隨機插入了10000條記錄,其中包括壹條:5555,admin。

從我的表中查找用戶名為“admin”select *的記錄,其中用戶名為“admin”;如果已經在username上建立了索引,MySQL無需任何掃描就能準確找到記錄。而是MySQL會掃描所有記錄,即查詢10000條記錄。

索引分為單列索引和組合索引。單列索引是指壹個索引只包含壹列,壹個表可以有多個單列索引,但這不是復合索引。復合索引,即壹個索引包含多個列。

MySQL索引類型包括:

(1)總索引

這是最基本的指標,沒有限制。它可以通過以下方式創建:

◆創建索引

在mytable(username(length))上創建索引indexName如果是CHAR和VARCHAR類型,長度可以小於字段的實際長度;如果是BLOB和TEXT類型,必須指定長度,下同。

◆修改表格結構

ALTER my table ADD INDEX[INDEX name]ON(用戶名(長度))

◆創建表格時直接指定。

CREATE TABLE my TABLE(ID INT NOT NULL,username VARCHAR(16)NOT NULL,INDEX[INDEX name](username(length));

刪除索引的語法:

刪除mytable上的索引[indexName];

(2)唯壹索引

它類似於前面的普通索引,只是索引列的值必須是唯壹的,但允許空值。如果是復合索引,列值的組合必須是唯壹的。它可以通過以下方式創建:

◆創建索引

在mytable上創建唯壹索引indexName(用戶名(長度))

◆修改表格結構

ALTER my table ADD UNIQUE[index name]ON(用戶名(長度))

◆創建表格時直接指定。

創建表mytable( ID INT NOT NULL,username VARCHAR(16)NOT NULL,UNIQUE[index name](username(length)));

(3)主鍵索引

這是壹個特殊的唯壹索引,不允許空值。通常,主鍵索引是在構建表的同時創建的:

創建表mytable( ID INT NOT NULL,用戶名VARCHAR(16) NOT NULL,主鍵(ID));您也可以使用ALTER命令。記住:壹個表只能有壹個主鍵。

(4)綜合指數

為了直觀地比較單列索引和組合索引,請向表中添加多個字段:

創建表mytable( ID INT不為空,用戶名VARCHAR(16)不為空,城市VARCHAR(50)不為空,年齡INT不為空);為了進壹步提取MySQL的效率,有必要考慮建立壹個組合索引。就是把名字,城市,年齡年齡構建成壹個索引:

ALTER TABLE mytable添加索引name_city_age (name(10),city,age);建表的時候usernname的長度是16,這裏用的是10。這是因為壹般情況下,名稱的長度不會超過10,這樣會加快索引查詢的速度,減小索引文件的大小,提高插入的更新速度。

如果分別在usernname、city、age上建立單列索引,使得表有三個單列索引,那麽查詢的效率會和上面的組合索引有很大的差別,遠低於我們的組合索引。雖然此時有三個索引,但MySQL只能使用它認為似乎最高效的單列索引。

建立這樣的組合指數實際上相當於分別建立以下三組組合指數:

為什麽username,city,age usernname,city usernname沒有城市和年齡這樣的組合索引?這是因為MySQL綜合指數嗎?最左邊的前綴?結果。簡單的理解就是只從左邊組合。並非所有包含這三列的查詢都將使用該復合索引,但以下SQL將使用該復合索引:

select * from my table why username = " admin " and city = "鄭州"

SELECT * FROM my table WHREE username = " admin "

並且不會使用以下內容:

從我的表中選擇*為什麽年齡= 20,城市=“鄭州”

Select * from my table why city = "鄭州"

比如有這樣壹個語句:select * from users where area=?北京?而年齡= 22;

如果我們分別在area和age上創建單個索引,mysql查詢壹次只能使用壹個索引,所以雖然這比不加索引的全表掃描提高了很多效率,但是如果在area和age列上創建復合索引會帶來更高的效率。

如果我們創建壹個(面積,年齡,工資)的復合指數,實際上相當於創建了(面積,年齡,工資),(面積,年齡),(面積)三個指數,這叫做?最佳左前綴?特點。所以我們在創建復合索引的時候,要把最常用的作為限制的列放在左邊,然後依次遞減。

(5)建立指數的時機

我們在這裏學習了建立指數,那麽在什麽情況下需要建立指數呢?壹般來說,出現在WHERE和JOIN中的列需要被索引,但事實並非完全如此,因為MySQL只用於

select t . name from mytable left JOIN my table m on t . name = m . username其中m.age = 20,m.city = '鄭州'這時就需要索引city和age,也需要索引my table的userame,因為它也出現在JOIN子句中。

剛剛提到只有喜歡才需要在特定時間被索引。因為MySQL在進行以通配符%和_開頭的查詢時不使用索引。例如,下面的句子使用了壹個索引:

SELECT * FROM mytable,其中用戶名為“admin%”

而下壹句就不用了:

select * from my table when name LIKE ' % admin '因此,我們在使用LIKE時要註意上面的區別。

對於查詢占主導地位的應用程序,索引尤其重要。很多時候,性能問題只是因為忘記添加索引,或者沒有添加更有效的索引。如果不加

索引,那麽找到任何壹條甚至是特定的壹條數據都會進行全表掃描,如果壹個表有大量的數據而合格的結果很少,那麽不索引會導致致命的性能。

放下。但是,沒有必要在每種情況下都建立索引。比如性別可能只有兩個值。建索引不僅沒有優勢,還會影響更新速度。這被稱為過渡指數。

(6)指數的缺點

以上都談到了使用索引的好處,但是過多的使用索引會導致濫用。因此,該指數也將有其缺點:

索引雖然大大提高了查詢速度,但是也會減慢更新表的速度,比如插入、更新、刪除表。因為在更新表的時候,MySQL不僅要保存數據,還要保存索引文件。

◆索引文件時會占用磁盤空間。壹般來說,這個問題不太嚴重,但是如果在壹個大表上創建多個組合索引,索引文件會迅速膨脹。

索引只是提高效率的壹個因素。如果妳的MySQL有大量的表,妳需要花時間研究和建立最好的索引或者優化查詢語句。

(7)使用指標的註意事項

使用索引時有壹些提示和註意事項:

◆索引將不包含具有空值的列。

只要列包含空值,它就不會包含在索引中。只要復合索引中的某壹列包含空值,該列對於該復合索引就無效。所以我們在設計數據庫的時候不應該讓字段的默認值為NULL。

◆使用短索引。

如果可能,索引字符串列並指定前綴長度。例如,如果有壹個CHAR(255)的列,如果多值在前10或20個字符內是唯壹的,則不要對整列進行索引。短索引不僅可以提高查詢速度,還可以節省磁盤空間和I/O操作。

◆索引列排序

Mysql查詢壹次只能使用壹個索引,因此如果索引已經在where子句中使用,那麽order by中的列將不會使用該索引。因此,當數據庫的默認排序能夠滿足要求時,不要使用排序操作;盡量不要包含多個列的排序,如果有必要,最好為這些列創建壹個復合索引。

◆like語句操作

壹般來說,不鼓勵使用like操作。如果有必要,怎麽用也是個問題。比如?%aaa%?不會用索引,喜歡嗎?aaa%?妳可以使用索引。

◆不要在列上執行操作。

select * from users where YEAR(add date)& lt;2007;該操作將在每壹行上執行,這將導致索引無效,並掃描整個表,因此我們可以將其更改為:

select * from users where adddate & lt;?2007-01-01?;

◆不要在and中使用not

以上介紹了MySQL的索引類型。

######################################################################################################################

表的主鍵

自動創建唯壹索引

如zl_yhjbqk(用戶基本信息)中的hbs_bh(用戶標識號)

表的字段唯壹約束

ORACLE使用索引來確保數據完整性。

如lc_hj(進程鏈接)中的lc_bh+hj_sx(進程號+鏈接順序)。

直接條件查詢的字段

SQL中用於約束的字段

如zl_yhjbqk(用戶基本信息)中的qc_bh(地區書號)

select * from zl_yhjbqk其中qc _ bh = & lt2000和QC _ BH & gt;=5000;

與查詢中其他表相關聯的字段

字段通常建立外鍵關系。

如zl_ydcf(功耗組件)中的jldb_bh(計量點表號)。

select * from zl_ydcf a,zl_yhdb b其中a.jldb_bh=b.jldb_bh和b.jldb_bh=?540100214511?

查詢中排序的字段

排序後的字段如果通過索引訪問,會大大提高排序速度。

select * from ZL _ yhjbqk order by qc_bh(建立QC _ BH索引)

select * from zl_yhjbqk其中qc_bh=?7001?按cb_sx排序(創建壹個qc_bh+cb_sx的復合索引,註意:只是壹個索引,包括qc_bh和cb_sx字段)。

查詢中用於統計或分組統計的字段

從zl_yhjbqk中選擇max(hbs_bh)

select qc_bh,count(*)from ZL _ yhjbqk group by QC _ BH

什麽情況下應該不建或者少建索引?

表格記錄太少

如果壹個表只有五條記錄,並且記錄是通過索引訪問的,那麽就需要先訪問索引表,然後通過索引表訪問數據表。通常,索引表和數據表不在同壹個數據塊中。在這種情況下,ORACLE必須至少來回讀取數據塊兩次。沒有索引,ORACLE會壹次性讀取所有數據,處理速度明顯會比有索引快。

比如表zl_sybm(使用部門)壹般只有幾條記錄,索引除主鍵以外的任何字段都不會產生性能優化。事實上,如果對表進行統計分析,ORACLE不會使用您的索引,但會自動執行全表訪問。比如:

select * from zl_sybm其中sydw_bh=?5401?(索引sydw_bh不會導致性能優化)

頻繁插入、刪除和修改的表。

對於壹些經常處理的業務表,在查詢允許的情況下盡量減少索引,比如zl_yhbm、gc_dfss、gc_dfys、gc_fpdy等業務表。

數據重復且分布均勻的表字段(如性別字段)

如果壹個表有65438萬行記錄,壹個字段A只有T和F兩個值,每個值的分布概率在50%左右,那麽索引這個表的字段A壹般不會提高數據庫的查詢速度。

壹種表字段,通常與主字段壹起查詢,但有更多主字段的索引值。

比如gc_dfss(實收電費)表,經常會根據收費流水號、用戶識別號、抄表日期、電費發生年月、運行標誌來查詢某筆款項。如果所有字段都建立在索引中,將增加數據修改、插入和刪除的時間。事實上,如果按照收費序列號對壹筆付款進行索引,它會將記錄的數量減少到只有幾條,如果按照下面的字段進行索引,它不會產生太大的性能。

千萬級MySQL數據庫建立索引的問題及提高性能的方法

壹、註意事項:

首先,妳要考慮表空間和磁盤空間是否足夠。我們知道索引也是壹種數據,在建立索引時必然會占用大量的表空間。因此,在索引大型表時,首先要考慮空間容量。

其次,索引時要鎖定表,需要註意的是操作要在業務空閑時進行。

二、性能調整:

首先要考慮的是磁盤I/O。實際上,您應該嘗試將索引和數據分布在不同的磁盤上(不考慮陣列)。從邏輯上講,數據表空間與索引表空間是分開的。這是建立索引時應該遵循的基本原則。

其次,我們知道建立索引時要掃描整個表,所以要考慮增加初始化參數db_file_multiblock_read_count的值。通常設置為32或更高。

再次,除了掃描整個表之外,還需要大量的排序操作來建立索引,所以要調整排序區域的大小。

在9i之前,可以在會話級增加sort_area_size的大小,比如設置為100m以上。

9i以後,如果初始化參數workarea_size_policy的值為TRUE,則排序區域自動從pga_aggregate_target分配。

最後,在創建索引時,可以添加nologging選項。為了減少索引過程中產生的大量重做,從而提高執行速度。

######################################################################################################################

壹般來說,必須對以下字段進行索引:

1.應該對相關查詢的外鍵字段進行索引。

2.要排序的字段(放在order方法中)

3.要查詢的字段(放在where方法中)

4.將被分組的字段(放置在分組方法中)

少寫,多讀,多建索引,多寫,少讀,少建索引,少數據不建索引。

設計MySql索引可以讓妳的數據庫飛起來,大大提高數據庫的效率。

如何正確建立MYSQL數據庫索引

標簽: