在數據庫表中,索引字段可以大大提高查詢速度。假設我們創建了壹個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數據庫索引
標簽: