命名規(guī)則:表名_字段名
1叫胁、需要加索引的字段枉侧,要在where條件中
2、數(shù)據(jù)量少的字段不需要加索引
3肛宋、如果where條件中是OR關系州藕,加索引不起作用
4、符合最左原則
https://segmentfault.com/q/1010000003984016/a-1020000003984281
聯(lián)合索引又叫復合索引酝陈。對于復合索引:Mysql從左到右的使用索引中的字段床玻,一個查詢可以只使用索引中的一部份,但只能是最左側部分沉帮。例如索引是key index (a,b,c). 可以支持a?|?a,b|?a,b,c?3種組合進行查找锈死,但不支持 b,c進行查找 .當最左側字段是常量引用時,索引就十分有效穆壕。
兩個或更多個列上的索引被稱作復合索引待牵。
利用索引中的附加列,您可以縮小搜索的范圍喇勋,但使用一個具有兩列的索引 不同于使用兩個單獨的索引缨该。復合索引的結構與電話簿類似,人名由姓和名構成川背,電話簿首先按姓氏對進行排序压彭,然后按名字對有相同姓氏的人進行排序。如果您知 道姓渗常,電話簿將非常有用;如果您知道姓和名汗盘,電話簿則更為有用皱碘,但如果您只知道名不姓,電話簿將沒有用處隐孽。
所以說創(chuàng)建復合索引時癌椿,應該仔細考慮列的順序。對索引中的所有列執(zhí)行搜索或僅對前幾列執(zhí)行搜索時菱阵,復合索引非常有用踢俄;僅對后面的任意列執(zhí)行搜索時,復合索引則沒有用處晴及。
http://blog.csdn.net/lmh12506/article/details/8879916
當一個表有多條索引可走時,? Mysql? 根據(jù)查詢語句的成本來選擇走哪條索引, 聯(lián)合索引的話, 它往往計算的是第一個字段(最左邊那個), 這樣往往會走錯索引. 如:
索引Index_1(Create_Time, Category_ID), Index_2(Category_ID)
如果每天的數(shù)據(jù)都特別多, 而且有很多category, 但具體每個category的記錄不會很多.
當查詢SQL條件為select …where create_time ….and category_id=..時, 很可能不走索引Index_1, 而走索引Index_2, 導致查詢比較慢.
解決辦法是將索引字段的順序調(diào)換一下.
http://www.cnblogs.com/krisy/archive/2013/07/12/3186258.html
?創(chuàng)建索引
在執(zhí)行CREATE TABLE語句時可以創(chuàng)建索引都办,也可以單獨用CREATE INDEX或ALTER TABLE來為表增加索引。
1.ALTER TABLE
ALTER TABLE用來創(chuàng)建普通索引、UNIQUE索引或PRIMARY KEY索引琳钉。
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
其中table_name是要增加索引的表名势木,column_list指出對哪些列進行索引,多列時各列之間用逗號分隔歌懒。索引名index_name可選啦桌,缺省時,MySQL將根據(jù)第一個索引列賦一個名稱及皂。另外甫男,ALTER TABLE允許在單個語句中更改多個表,因此可以在同時創(chuàng)建多個索引验烧。
2.CREATE INDEX
CREATE INDEX可對表增加普通索引或UNIQUE索引板驳。
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
table_name、index_name和column_list具有與ALTER TABLE語句中相同的含義噪窘,索引名不可選笋庄。另外,不能用CREATE INDEX語句創(chuàng)建PRIMARY KEY索引倔监。
3.索引類型
在創(chuàng)建索引時直砂,可以規(guī)定索引能否包含重復值。如果不包含浩习,則索引應該創(chuàng)建為PRIMARY KEY或UNIQUE索引静暂。對于單列惟一性索引,這保證單列不包含重復的值谱秽。對于多列惟一性索引洽蛀,保證多個值的組合不重復。
PRIMARY KEY索引和UNIQUE索引非常類似疟赊。
事實上郊供,PRIMARY KEY索引僅是一個具有名稱PRIMARY的UNIQUE索引。這表示一個表只能包含一個PRIMARY KEY近哟,因為一個表中不可能具有兩個同名的索引驮审。
下面的SQL語句對students表在sid上添加PRIMARY KEY索引。
ALTER TABLE students ADD PRIMARY KEY (sid)
4.??刪除索引
可利用ALTER TABLE或DROP INDEX語句來刪除索引吉执。類似于CREATE INDEX語句疯淫,DROP INDEX可以在ALTER TABLE內(nèi)部作為一條語句處理,語法如下戳玫。
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
其中熙掺,前兩條語句是等價的,刪除掉table_name中的索引index_name咕宿。
第3條語句只在刪除PRIMARY KEY索引時使用币绩,因為一個表只可能有一個PRIMARY KEY索引蜡秽,因此不需要指定索引名。如果沒有創(chuàng)建PRIMARY KEY索引类浪,但表具有一個或多個UNIQUE索引载城,則MySQL將刪除第一個UNIQUE索引。
如果從表中刪除了某列费就,則索引會受到影響诉瓦。對于多列組合的索引,如果刪除其中的某列力细,則該列也會從索引中刪除睬澡。如果刪除組成索引的所有列,則整個索引將被刪除眠蚂。
5.查看索引
mysql> show?index from tblname;
mysql> show keys from tblname;
· Table
表的名稱煞聪。
· Non_unique
如果索引不能包括重復詞,則為0逝慧。如果可以昔脯,則為1。
· Key_name
索引的名稱笛臣。
· Seq_in_index
索引中的列序列號云稚,從1開始。
· Column_name
列名稱沈堡。
· Collation
列以什么方式存儲在索引中静陈。在MySQL中,有值‘A’(升序)或NULL(無分類)诞丽。
· Cardinality
索引中唯一值的數(shù)目的估計值鲸拥。通過運行ANALYZE TABLE或myisamchk -a可以更新∩猓基數(shù)根據(jù)被存儲為整數(shù)的統(tǒng)計數(shù)據(jù)來計數(shù)刑赶,所以即使對于小型表,該值也沒有必要是精確的懂衩〗亲玻基數(shù)越大,當進行聯(lián)合時勃痴,MySQL使用該索引的機會就越大。
· Sub_part
如果列只是被部分地編入索引热康,則為被編入索引的字符的數(shù)目沛申。如果整列被編入索引,則為NULL姐军。
· Packed
指示關鍵字如何被壓縮铁材。如果沒有被壓縮尖淘,則為NULL。
· Null
如果列含有NULL著觉,則含有YES村生。如果沒有,則該列含有NO饼丘。
· Index_type
用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)趁桃。
· Comment
6.什么情況下使用索引
?????? 表的主關鍵字
自動建立唯一索引
如zl_yhjbqk(用戶基本情況)中的hbs_bh(戶標識編號)
表的字段唯一約束
ORACLE利用索引來保證數(shù)據(jù)的完整性
如lc_hj(流程環(huán)節(jié))中的lc_bh+hj_sx(流程編號+環(huán)節(jié)順序)
直接條件查詢的字段
在SQL中用于條件約束的字段
如zl_yhjbqk(用戶基本情況)中的qc_bh(區(qū)冊編號)
select * from zl_yhjbqk where qc_bh=’<????甼曀???>7001’
查詢中與其它表關聯(lián)的字段
字段常常建立了外鍵關系
如zl_ydcf(用電成份)中的jldb_bh(計量點表編號)
select * from zl_ydcf a,zl_yhdb b where a.jldb_bh=b.jldb_bh and b.jldb_bh=’540100214511’
查詢中排序的字段
排序的字段如果通過索引去訪問那將大大提高排序速度
select * from zl_yhjbqk order by qc_bh(建立qc_bh索引)
select * from zl_yhjbqk where qc_bh=’7001’ order by cb_sx(建立qc_bh+cb_sx索引,注:只是一個索引肄鸽,其中包括qc_bh和cb_sx字段)
查詢中統(tǒng)計或分組統(tǒng)計的字段
select max(hbs_bh) from zl_yhjbqk
select qc_bh,count(*) from zl_yhjbqk group by qc_bh
什么情況下應不建或少建索引
表記錄太少
如果一個表只有5條記錄卫病,采用索引去訪問記錄的話,那首先需訪問索引表典徘,再通過索引表訪問數(shù)據(jù)表蟀苛,一般索引表與數(shù)據(jù)表不在同一個數(shù)據(jù)塊,這種情況下ORACLE至少要往返讀取數(shù)據(jù)塊兩次逮诲。而不用索引的情況下ORACLE會將所有的數(shù)據(jù)一次讀出帜平,處理速度顯然會比用索引快。
如表zl_sybm(使用部門)一般只有幾條記錄梅鹦,除了主關鍵字外對任何一個字段建索引都不會產(chǎn)生性能優(yōu)化裆甩,實際上如果對這個表進行了統(tǒng)計分析后ORACLE也不會用你建的索引,而是自動執(zhí)行全表訪問帘瞭。如:
select * from zl_sybm where sydw_bh=’5401’(對sydw_bh建立索引不會產(chǎn)生性能優(yōu)化)
經(jīng)常插入淑掌、刪除、修改的表
對一些經(jīng)常處理的業(yè)務表應在查詢允許的情況下盡量減少索引蝶念,如zl_yhbm抛腕,gc_dfss,gc_dfys媒殉,gc_fpdy等業(yè)務表担敌。
數(shù)據(jù)重復且分布平均的表字段
假如一個表有10萬行記錄,有一個字段A只有T和F兩種值廷蓉,且每個值的分布概率大約為50%全封,那么對這種表A字段建索引一般不會提高數(shù)據(jù)庫的查詢速度。
經(jīng)常和主字段一塊查詢但主字段索引值比較多的表字段
如gc_dfss(電費實收)表經(jīng)常按收費序號桃犬、戶標識編號刹悴、抄表日期、電費發(fā)生年月攒暇、操作 標志來具體查詢某一筆收款的情況土匀,如果將所有的字段都建在一個索引里那將會增加數(shù)據(jù)的修改、插入形用、刪除時間就轧,從實際上分析一筆收款如果按收費序號索引就已 經(jīng)將記錄減少到只有幾條证杭,如果再按后面的幾個字段索引查詢將對性能不產(chǎn)生太大的影響。
對千萬級MySQL數(shù)據(jù)庫建立索引的事項及提高性能的手段
一妒御、注意事項:
首先解愤,應當考慮表空間和磁盤空間是否足夠。我們知道索引也是一種數(shù)據(jù)乎莉,在建立索引的時候勢必也會占用大量表空間送讲。因此在對一大表建立索引的時候首先應當考慮的是空間容量問題。
其次梦鉴,在對建立索引的時候要對表進行加鎖李茫,因此應當注意操作在業(yè)務空閑的時候進行。
二肥橙、性能調(diào)整方面:
首當其沖的考慮因素便是磁盤I/O魄宏。物理上,應當盡量把索引與數(shù)據(jù)分散到不同的磁盤上(不考慮陣列的情況)存筏。邏輯上宠互,數(shù)據(jù)表空間與索引表空間分開。這是在建索引時應當遵守的基本準則椭坚。
其次予跌,我們知道,在建立索引的時候要對表進行全表的掃描工作善茎,因此券册,應當考慮調(diào)大初始化參數(shù)db_file_multiblock_read_count的值。一般設置為32或更大垂涯。
再次烁焙,建立索引除了要進行全表掃描外同時還要對數(shù)據(jù)進行大量的排序操作,因此耕赘,應當調(diào)整排序區(qū)的大小骄蝇。
????9i之前,可以在session級別上加大sort_area_size的大小操骡,比如設置為100m或者更大九火。
????9i以后,如果初始化參數(shù)workarea_size_policy的值為TRUE册招,則排序區(qū)從pga_aggregate_target里自動分配獲得岔激。
最后,建立索引的時候是掰,可以加上nologging選項鹦倚。以減少在建立索引過程中產(chǎn)生的大量redo,從而提高執(zhí)行的速度冀惭。
MySql在建立索引優(yōu)化時需要注意的問題
設計好MySql的索引可以讓你的數(shù)據(jù)庫飛起來震叙,大大的提高數(shù)據(jù)庫效率。設計MySql索引的時候有一下幾點注意:
1散休,創(chuàng)建索引
對于查詢占主要的應用來說媒楼,索引顯得尤為重要。很多時候性能問題很簡單的就是因為我們忘了添加索引而造成的戚丸,或者說沒有添加更為有效的索引導致划址。如果不加
索引的話,那么查找任何哪怕只是一條特定的數(shù)據(jù)都會進行一次全表掃描限府,如果一張表的數(shù)據(jù)量很大而符合條件的結果又很少夺颤,那么不加索引會引起致命的性能下降。
但是也不是什么情況都非得建索引不可胁勺,比如性別可能就只有兩個值世澜,建索引不僅沒什么優(yōu)勢,還會影響到更新速度署穗,這被稱為過度索引寥裂。
2,復合索引
比如有一條語句是這樣的:select * from users where area=’beijing’ and age=22;
如果我們是在area和age上分別創(chuàng)建單個索引的話案疲,由于mysql查詢每次只能使用一個索引封恰,所以雖然這樣已經(jīng)相對不做索引時全表掃描提高了很多效
率,但是如果在area褐啡、age兩列上創(chuàng)建復合索引的話將帶來更高的效率诺舔。如果我們創(chuàng)建了(area, age,salary)的復合索引,那么其實相當于創(chuàng)建了(area,age,salary)备畦、(area,age)低飒、(area)三個索引,這被稱為最佳左前綴特性萍恕。
因此我們在創(chuàng)建復合索引時應該將最常用作限制條件的列放在最左邊逸嘀,依次遞減。
3允粤,索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中崭倘,復合索引中只要有一列含有NULL值,那么這一列對于此復合索引就是無效的类垫。所以我們在數(shù)據(jù)庫設計時不要讓字段的默認值為NULL司光。
4,使用短索引
對串列進行索引悉患,如果可能應該指定一個前綴長度栅组。例如,如果有一個CHAR(255)的 列历葛,如果在前10 個或20 個字符內(nèi),多數(shù)值是惟一的茴晋,那么就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節(jié)省磁盤空間和I/O操作回窘。
5诺擅,排序的索引問題
mysql查詢只使用一個索引,因此如果where子句中已經(jīng)使用了索引的話啡直,那么order by中的列是不會使用索引的烁涌。因此數(shù)據(jù)庫默認排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序酒觅,如果需要最好給這些列創(chuàng)建復合索引撮执。
6,like語句操作
一般情況下不鼓勵使用like操作舷丹,如果非使用不可抒钱,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引掂榔。
7继效,不要在列上進行運算
select * from users where
YEAR(adddate)
8,不使用NOT IN和操作
NOT IN和操作都不會使用索引將進行全表掃描装获。NOT IN可以NOT EXISTS代替瑞信,id3則可使用id>3 or id
http://www.cnblogs.com/alazalazalaz/p/4083696.html