新聞中心
MySQL是一款非常流行的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。在MySQL中,索引是一個非常重要的概念。MySQL索引可以極大地提高查詢數(shù)據(jù)的速度。但是,在MySQL中,如果沒有正確地使用索引,將會導(dǎo)致嚴(yán)重的性能問題。所以,如何知道MySQL是否建立了索引,成為了一個很重要的問題。接下來,本文將介紹如何判斷MySQL數(shù)據(jù)庫是否建立了索引。

西和網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)公司2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
一、使用SQL語句查詢
我們可以使用SQL語句查詢MySQL數(shù)據(jù)庫中是否建立了索引。這個方法非常簡單,只需要使用SHOW INDEXES語句即可。下面是具體的查詢語句:
SHOW INDEXES FROM table_name;
其中,table_name是要查詢的表名。
執(zhí)行上述語句之后,將會展示該表中所有的索引信息。這些信息包括索引名稱、唯一性、字段名稱、索引類型、字段長度等。
需要注意的是,SHOW INDEXES語句只能查詢MySQL數(shù)據(jù)庫中的索引信息,而不能很好地反應(yīng)這些索引對查詢性能的影響。
二、使用EXPLN語句分析查詢性能
我們可以使用EXPLN語句來分析查詢性能。EXPLN語句可以顯示MySQL如何處理單個SQL查詢,包括如何使用表、如何使用索引以及如何連接表等。下面是具體的查詢語句:
EXPLN SELECT * FROM table_name WHERE column_name = ‘value’;
其中,table_name是要查詢的表名,column_name是要進行查詢的列名,value是要查詢的值。
執(zhí)行上述語句之后,將會展示MySQL如何執(zhí)行該查詢。這個結(jié)果將包括一個表格,其中包括每個表、索引名稱以及使用的列等信息。如果索引沒有被正確地使用,將會在結(jié)果中顯示”Using filesort”或”Using temporary”這樣的標(biāo)識。這兩種情況都代表了對性能的不利影響。
需要注意的是,EXPLN語句只對特定的查詢進行分析,而不能很好地反應(yīng)整個數(shù)據(jù)庫中的索引情況。
三、使用MySQL的性能分析工具
我們可以使用MySQL的性能分析工具來分析數(shù)據(jù)庫索引的使用情況。其中,最常用的工具是MySQL的性能分析器(MySQL Query Analyzer)。這個工具可以跟蹤查詢,檢測慢查詢、重復(fù)查詢等問題,并提供一些有用的信息。
使用MySQL性能分析器時,我們需要注意以下幾點:
1. 我們需要下載安裝MySQL Query Analyzer,并使用合適的配置文件連接到MySQL數(shù)據(jù)庫。
2. 然后,我們需要在查詢分析器中執(zhí)行想要分析的查詢。
3. 分析器將展示查詢的執(zhí)行時間、位置、使用的資源和每個查詢的詳細(xì)信息。
4. 我們可以使用分析器對查詢進行分析,并查看MySQL是否使用了正確的索引。
需要注意的是,使用MySQL性能分析器需要一些技巧,需要在使用之前進行一定的學(xué)習(xí)和掌握。
結(jié)論
在本文中,我們介紹了三種方法來判斷MySQL數(shù)據(jù)庫是否建立了索引,包括使用SQL語句查詢、使用EXPLN語句分析查詢性能以及使用MySQL的性能分析工具。在實際的使用中,我們可以根據(jù)具體的情況,選擇不同的方法來判斷MySQL數(shù)據(jù)庫中索引的使用情況。同時,為了保證MySQL的性能,我們需要定期地對數(shù)據(jù)庫索引進行優(yōu)化和調(diào)整。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,響應(yīng)式網(wǎng)站制作,設(shè)計師量身打造品牌風(fēng)格,熱線:028-86922220怎么查看mysql 索引的創(chuàng)建語句
Non_unique
如果索引不能包括猛數(shù)重復(fù)詞,則為0。如果可以,則為1。
· Key_name
索引的名稱。
· Seq_in_index
索引中的列序列號,從1開始。
· Column_name
列名稱。
· Collation
列以仿猛什么方式存儲在索引中。在枝大首MySQL中,有值‘A’(升序)或NULL(無分類)。
在滿足語句需求的情況下,盡量少的訪問資源是數(shù)據(jù)庫設(shè)計的重要原則,這和執(zhí)行的 SQL 有直接的關(guān)系,索引問題又是 SQL 問題中出現(xiàn)頻率更高的,常見的索引問題包括:無索引(失效)、隱式轉(zhuǎn)換。
1. SQL 執(zhí)行流程看一個問題,在下面這個表 T 中,如果我要執(zhí)行 select * from T where k between 3 and 5; 需要執(zhí)行幾次樹的搜索操作,會掃描多少行?mysql> create table T ( -> ID int primary key, -> k int NOT NULL DEFAULT 0, -> s varchar(16) NOT NULL DEFAULT ”, -> index k(k)) -> engine=InnoDB;mysql> insert into T values(100,1, ‘a(chǎn)a’),(200,2,’bb’),\ (300,3,’cc’),(500,5,’ee’),(600,6,’ff’),(700,7,’gg’);
這分別是 ID 字段索引樹、k 字段索引樹。
這條 SQL 語句的執(zhí)行流程:
1. 在 k 索引樹上找到 k=3,獲得 ID=3002. 回表到 ID 索引樹查找 ID=300 的記錄,對應(yīng) R33. 在 k 索引樹找到下一個值 k=5,ID=5004. 再回到 ID 索引樹找到對應(yīng) ID=500 的 R4
5. 在 k 索引樹去下一個值 k=6,不符合條件,循環(huán)結(jié)束
這個過程讀取了 k 索引樹的三條記錄,回表了兩次。因為查詢結(jié)果所需要的數(shù)據(jù)只在主鍵索引上有,所以必須得回表。所以,我們該如何通過優(yōu)化索引,來沒沒避免回表呢?
2. 常見索引優(yōu)化2.1 覆蓋索引覆蓋索引,換言之就是索引要覆蓋我們的查詢請求,無需回表。
如果執(zhí)行的語句是 select ID from T wherek between 3 and 5;,這樣的話因為 ID 的值在 k 索引樹上,就不需要回表了。
覆蓋索引可以減少樹的搜索次數(shù),顯著提升查詢性能,是常用的性能優(yōu)化手段。
但是,維護索引是有代價的,所以在建立冗余索引來支持覆蓋索引時要權(quán)衡利弊。
2.2 最左前綴原則
B+ 樹的數(shù)據(jù)項是復(fù)合的數(shù)據(jù)結(jié)構(gòu),比如 (name,sex,age) 的時候,B+ 樹是按照從左到右州沖的順序來建立搜索樹的,當(dāng) (張三,F,26) 這樣的數(shù)據(jù)來檢索的時候,B+ 樹會優(yōu)先比較 name 來確定下一步的檢索方向,如果 name 相同再依枯跡納次比較 sex 和 age,最后得到檢索的數(shù)據(jù)。
# 有這樣一個表 P
mysql> create table P (id int primary key, name varchar(10) not null, sex varchar(1), age int, index tl(name,sex,age)) engine=IInnoDB;
mysql> insert into P values(1,’張三’,’F’,26),(2,’張三’,’M’,27),(3,’李四’,’F’,28),(4,’烏茲’,’F’,22),(5,’張三’,’M’,21),(6,’王五’,’M’,28);
# 下面的語句結(jié)果相同
mysql> select * from P where name=’張三’ and sex=’F’; ## A1
mysql> select * from P where sex=’F’ and age=26;## A2
# explain 看一下
mysql> explain select * from P where name=’張三’ and sex=’F’;
+—-++++——+-+——+++——+++
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref| rows | filtered | Extra|
+—-++++——+-+——+++——+++
| 1 | SIMPLE | P | NULL| ref | tl| tl || const,const | 1 | 100.00 | Using index |
+—-++++——+-+——+++——+++
mysql> explain select * from P where sex=’F’ and age=26;
+—-+++++-+——++——+——+++
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+—-+++++-+——++——+——+++
| 1 | SIMPLE | P | NULL| index | NULL| tl || NULL | 6 | 16.67 | Using where; Using index |
+—-+++++-+——++——+——+++
可以清楚的看到,A1 使用 tl 索引,A2 進行了全表掃描,雖然 A2 的兩個條件都在 tl 索引中出現(xiàn),但是沒有使用到 name 列,不符合最左前綴原則,無法使用索引。所以在建立聯(lián)合索引的時候,如何安排索引內(nèi)的字段排序是關(guān)鍵。評估標(biāo)準(zhǔn)是索引的復(fù)用能力,因為支持最左前綴,所以當(dāng)建立(a,b)這個聯(lián)合索引之后,就不需要給 a 單獨建立索引。原則上,如果通過調(diào)整順序,可以少維護一個索引,那么這個順序往往就是需要優(yōu)先考慮采用的。上面這個例子中,如果查詢條件里只有 b,就是沒法利用(a,b)這個聯(lián)合索引的,這時候就不得不維護另一個索引,也就是說要同時維護(a,b)、(b)兩個索引。這樣的話,就需要考慮空間占用了,比如,name 和 age 的聯(lián)合索引,name 字段比 age 字段占用空間大,所以創(chuàng)建(name,age)聯(lián)合索引和(age)索引占用空間是要小于(age,name)、(name)索引的。
2.3 索引下推
以人員表的聯(lián)合索引(name, age)為例。如果現(xiàn)在有一個需求:檢索出表中“名字之一個字是張,而且年齡是26歲的所有男性”。那么,SQL 語句是這么寫的mysql> select * from tuser where name like ‘張%’ and age=26 and sex=M;
通過最左前綴索引規(guī)則,會找到 ID1,然后需要判斷其他條件是否滿足在 MySQL 5.6 之前,只能從 ID1 開始一個個回表。到主鍵索引上找出數(shù)據(jù)行,再對比字段值。而 MySQL 5.6 引入的索引下推優(yōu)化(index condition pushdown),可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數(shù)。這樣,減少了回表次數(shù)和之后再次過濾的工作量,明顯提高檢索速度。
2.4 隱式類型轉(zhuǎn)化
隱式類型轉(zhuǎn)化主要原因是,表結(jié)構(gòu)中指定的數(shù)據(jù)類型與傳入的數(shù)據(jù)類型不同,導(dǎo)致索引無法使用。所以有兩種方案:
修改表結(jié)構(gòu),修改字段數(shù)據(jù)類型。
修改應(yīng)用,將應(yīng)用中傳入的字符類型改為與表結(jié)構(gòu)相同類型。
3. 為什么會選錯索引3.1 優(yōu)化器選擇索引是優(yōu)化器的工作,其目的是找到一個更優(yōu)的執(zhí)行方案,用最小的代價去執(zhí)行語句。在數(shù)據(jù)庫中,掃描行數(shù)是影響執(zhí)行代價的因素之一。掃描的行數(shù)越少,意味著訪問磁盤數(shù)據(jù)的次數(shù)越少,消耗的 CPU 資源越少。當(dāng)然,掃描行數(shù)并不是唯一的判斷標(biāo)準(zhǔn),優(yōu)化器還會結(jié)合是否使用臨時表、是否排序等因素進行綜合判斷。
3.2 掃描行數(shù)
MySQL 在真正開始執(zhí)行語句之前,并不能精確的知道滿足這個條件的記錄有多少條,只能通過索引的區(qū)分度來判斷。顯然,一個索引上不同的值越多,索引的區(qū)分度就越好,而一個索引上不同值的個數(shù)我們稱為“基數(shù)”,也就是說,這個基數(shù)越大,索引的區(qū)分度越好。# 通過 show index 方法,查看索引的基數(shù)mysql> show index from t;++++++++++——+++-+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |++++++++++——+++-+| t || PRIMARY || id| A|| NULL | NULL | | REE || || t || a|| a| A|| NULL | NULL | YES | REE || || t || b|| b| A|| NULL | NULL | YES | REE || |++++++++++——+++-+
MySQL 使用采樣統(tǒng)計方法來估算基數(shù):采樣統(tǒng)計的時候,InnoDB 默認(rèn)會選擇 N 個數(shù)據(jù)頁,統(tǒng)計這些頁面上的不同值,得到一個平均值,然后乘以這個索引的頁面數(shù),就得到了這個索引的基數(shù)。而數(shù)據(jù)表是會持續(xù)更新的,索引統(tǒng)計信息也不會固定不變。所以,當(dāng)變更的數(shù)據(jù)行數(shù)超過 1/M 的時候,會自動觸發(fā)重新做一次索引統(tǒng)計。
在 MySQL 中,有兩種存儲索引統(tǒng)計的方式,可以通過設(shè)置參數(shù) innodb_stats_persistent 的值來選擇:
on 表示統(tǒng)計信息會持久化存儲。默認(rèn) N = 20,M = 10。
off 表示統(tǒng)計信息只存儲在內(nèi)存中。默認(rèn) N = 8,M = 16。
由于是采樣統(tǒng)計,所以不管 N 是 20 還是 8,這個基數(shù)都很容易不準(zhǔn)確。所以,冤有頭債有主,MySQL 選錯索引,還得歸咎到?jīng)]能準(zhǔn)確地判斷出掃描行數(shù)。
可以用 yze table 來重新統(tǒng)計索引信息,進行修正。
ANAZE TABLE tbl_name …
3.3 索引選擇異常和處理1. 采用 force index 強行選擇一個索引。2. 可以考慮修改語句,引導(dǎo) MySQL 使用我們期望的索引。3. 有些場景下,可以新建一個更合適的索引,來提供給優(yōu)化器做選擇,或刪掉誤用的索引。
1.索引作用
在索引列上,除了上面提到的有序查找之外,數(shù)據(jù)庫利用各種各樣的快速定位技術(shù),能夠大大提高查詢效率。特別是當(dāng)數(shù)據(jù)量非常大,查詢涉及多個表時,使用索引往往能使查詢速度加快成千上萬倍。
例如,有3個未索引的表t1、t2、t3,分別只包含列c1、c2、c3,每個表分別含有1000行數(shù)據(jù)組成,指為1~1000的數(shù)值,查找對應(yīng)值相等行的查詢?nèi)缦滤尽?/p>
SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3
此查詢結(jié)果應(yīng)該為1000行,每行包含3個相等的值。在無索引的情況下處理此查詢,必須尋找3個表所有的組合,以便得出與WHERE子句相配的那些行。而可能的組合數(shù)目為1000×1000×1000(十億),顯然查詢將會非常慢。
如果對每個表進行索引,就能極大地加速查詢進程。利用索引的查詢處理如下。
(1)從表t1中選擇之一行,查看此行所包含的數(shù)據(jù)。
(2)使用表t2上的索引,直接定位t2中與t1的值匹配的行。類似,猜春罩利用表t3上的索引,直接定位t3中與來自t1的值匹配的行。
(3)掃描表t1的下一行并重復(fù)前面的過程,直到遍歷t1中所有的行。
在此情形下,仍然對表t1執(zhí)行了一個完全掃描,但能夠在表t2和t3上進行索引查找直接取出這些表中的行,比未用索引時要快一百萬倍。
利用索引,MySQL加速了WHERE子句滿足條件行的搜索,而在多表連接查詢時,在執(zhí)行連接時加快了與其他表中的行匹配的速度。
2. 創(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ī)定索引能否包含森顫重復(fù)值。如果不包含,則索引應(yīng)該創(chuàng)建為PRIMARY KEY或UNIQUE索引。對于單列惟一性索引,這保證單列不包含重復(fù)的值。對于多列惟一性索引,保證多個值的組合不重復(fù)。
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
如果索引不能包括重復(fù)詞,則為0。如果可以,則為1。
· Key_name
索引的名稱。
· Seq_in_index
索引中的列序列號,從1開始。
· Column_name
列名稱。
· Collation
列以什么方式存儲在索引中。在MySQL中,有值‘A’(升序)或NULL(無分類)。
· Cardinality
索引中唯一值的數(shù)目的估計值。通過運行ANAZE TABLE或myisamchk -a可以更新?;鶖?shù)根據(jù)被存儲為整數(shù)的統(tǒng)計數(shù)據(jù)來計數(shù),所以即使對于小型表,該值也沒有必要是精確的?;鶖?shù)越大,當(dāng)進行聯(lián)合時,MySQL使用該索引的機會就越大。
· Sub_part
如果列只是被部分地編入索引,則為被編入索引的字符的數(shù)目。如果整列被編入索引,則為NULL。
· Packed
指示關(guān)鍵字如何被壓縮。如果沒有被壓縮,則為NULL。
· Null
如果列含有NULL,則含有YES。如果沒有,則該列含有NO。
· Index_type
用過的索引方法(REE, FULLTEXT, HASH, RTREE)。
· Comment
6.什么情況下使用索引
表的主關(guān)鍵字
自動建立唯一索引
如zl_yhjbqk(用戶基本情況)中的hbs_bh(戶標(biāo)識編號)
表的字段唯一約束
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’
查詢中與其它表關(guān)聯(lián)的字段
字段常常建立了外鍵關(guān)系
如zl_ydcf(用電成份)中的jldb_bh(計量點表編號)
select * from zl_ydcf a,zl_yhdb b where a.jldb_bh=b.jldb_bh and b.jldb_bh=’’
查詢中排序的字段
排序的字段如果通過索引去訪問那將大大提高排序速度
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
什么情況下應(yīng)不建或少建索引
表記錄太少
如果一個表只有5條記錄,采用索引去訪問記錄的話,那首先需訪問索引表,再通過索引表訪問數(shù)據(jù)表,一般索引表與數(shù)據(jù)表不在同一個數(shù)據(jù)塊,這種情況下ORACLE至少要往返讀取數(shù)據(jù)塊兩次。而不用索引的情況下ORACLE會將所有的數(shù)據(jù)一次讀出,處理速度顯然會比用索引快。
如表zl_sybm(使用部門)一般只有幾條記錄,除了主關(guān)鍵字外對任何一個字段建索引都不會產(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è)務(wù)表應(yīng)在查詢允許的情況下盡量減少索引,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等業(yè)務(wù)表。
數(shù)據(jù)重復(fù)且分布平均的表字段
假如一個表有10萬行記錄,有一個字段A只有T和F兩種值,且每個值的分布概率大約為50%,那么對這種表A字段建索引一般不會提高數(shù)據(jù)庫的查詢速度。
經(jīng)常和主字段一塊查詢但主字段索引值比較多的表字段
如gc_dfss(電費實收)表經(jīng)常按收費序號、戶標(biāo)識編號、抄表日期、電費發(fā)生年月、操作 標(biāo)志來具體查詢某一筆收款的情況,如果將所有的字段都建在一個索引里那將會增加數(shù)據(jù)的修改、插入、刪除時間,從實際上分析一筆收款如果按收費序號索引就已 經(jīng)將記錄減少到只有幾條,如果再按后面的幾個字段索引查詢將對性能不產(chǎn)生太大的影響。
對千萬級MySQL數(shù)據(jù)庫建立索引的事項及提高性能的手段
一、注意事項:
首先,應(yīng)當(dāng)考慮表空間和磁盤空間是否足夠。我們知道索引也是一種數(shù)據(jù),在建立索引的時候勢必也會占用大量表空間。因此在對一大表建立索引的時候首先應(yīng)當(dāng)考慮的是空間容量問題。
其次,在對建立索引的時候要對表進行加鎖,因此應(yīng)當(dāng)注意操作在業(yè)務(wù)空閑的時候進行。
二、性能調(diào)整方面:
首當(dāng)其沖的考慮因素便是磁盤I/O。物理上,應(yīng)當(dāng)盡量把索引與數(shù)據(jù)分散到不同的磁盤上(不考慮陣列的情況)。邏輯上,數(shù)據(jù)表空間與索引表空間分開。這是在建索引時應(yīng)當(dāng)遵守的基本準(zhǔn)則。
其次,我們知道,在建立索引的時候要對表進行全表的掃描工作,因此,應(yīng)當(dāng)考慮調(diào)大初始化參數(shù)db_file_multiblock_read_count的值。一般設(shè)置為32或更大。
再次,建立索引除了要進行全表掃描外同時還要對數(shù)據(jù)進行大量的排序操作,因此,應(yīng)當(dāng)調(diào)整排序區(qū)的大小。
9i之前,可以在session級別上加大sort_area_size的大小,比如設(shè)置為100m或者更大。
9i以后,如果初始化參數(shù)workarea_size_policy的值為TRUE,則排序區(qū)從pga_aggregate_target里自動分配獲得。
最后,建立索引的時候,可以加上nologging選項。以減少在建立索引過程中產(chǎn)生的大量redo,從而提高執(zhí)行的速度。
MySql在建立索引優(yōu)化時需要注意的問題
設(shè)計好MySql的索引可以讓你的數(shù)據(jù)庫飛起來,大大的提高數(shù)據(jù)庫效率。設(shè)計MySql索引的時候有一下幾點注意:
1,創(chuàng)建索引
對于查詢占主要的應(yīng)用來說,索引顯得尤為重要。很多時候性能問題很簡單的就是因為我們忘了添加索引而造成的,或者說沒有添加更為有效的索引導(dǎo)致。如果不加
索引的話,那么查找任何哪怕只是一條特定的數(shù)據(jù)都會進行一次全表掃描,如果一張表的數(shù)據(jù)量很大而符合條件的結(jié)果又很少,那么不加索引會引起致命的性能下
降。但是也不是什么情況都非得建索引不可,比如性別可能就只有兩個值,建索引不僅沒什么優(yōu)勢,還會影響到更新速度,這被稱為過度索引。
2,復(fù)合索引
比如有一條語句是這樣的:select * from users where area=’beijing’ and age=22;
如果我們是在area和age上分別創(chuàng)建單個索引的話,由于mysql查詢每次只能使用一個索引,所以雖然這樣已經(jīng)相對不做索引時全表掃描提高了很多效
率,但是如果在area、age兩列上創(chuàng)建復(fù)合索引的話將帶來更高的效率。如果我們創(chuàng)建了(area, age,
salary)的復(fù)合索引,那么其實相當(dāng)于創(chuàng)建了(area,age,salary)、(area,age)、(area)三個索引,這被稱為更佳左前綴
特性。因此我們在創(chuàng)建復(fù)合索引時應(yīng)該將最常用作限制條件的列放在最左邊,依次遞減。
3,索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,復(fù)合索引中只要有一列含有NULL值,那么這一列對于此復(fù)合索引就是無效的。所以我們在數(shù)據(jù)庫設(shè)計時不要讓字段的默認(rèn)值為NULL。
4,使用短索引
對串列進行索引,如果可能應(yīng)該指定一個前綴長度。例如,如果有一個CHAR(255)的 列,如果在前10 個或20 個字符內(nèi),多數(shù)值是惟一的,那么就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節(jié)省磁盤空間和I/O操作。
5,排序的索引問題
mysql查詢只使用一個索引,因此如果where子句中已經(jīng)使用了索引的話,那么order by中的列是不會使用索引的。因此數(shù)據(jù)庫默認(rèn)排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要更好給這些列創(chuàng)建復(fù)合索引。
6,like語句操作
一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引。
7,不要在列上進行運算
select * from users where
YEAR(adddate)
8,不使用NOT IN和操作
mysql中index的如何使用,判斷什么時候加索引
你好,可以參考:
僅供參考
例如:CREATE INDEX idx_test_name_age ON test_tab (name, age);那么SELECT * FROM test_tabWHEREname LIKE ‘張%’
AND age = 25
這春碼樣的查詢,將能夠使用上面的索引。
多列索引,還有一個可用的情況就是, 某些情況下,可能碰塵查詢,只訪問索引就足夠了, 不需要再扒吵哪訪問表了。例如:SELECTAVG( avg ) AS 平均年齡FROMtest_tabWHEREname LIKE ‘張%’這個時候, name 與 age 都包含在索引里面。 查詢不需要去檢索表中的數(shù)據(jù)。
關(guān)于mysql數(shù)據(jù)庫判斷索引建立的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技公司主營:網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、小程序制作、成都軟件開發(fā)、網(wǎng)頁設(shè)計、微信開發(fā)、成都小程序開發(fā)、網(wǎng)站制作、網(wǎng)站開發(fā)等業(yè)務(wù),是專業(yè)的成都做小程序公司、成都網(wǎng)站建設(shè)公司、成都做網(wǎng)站的公司。創(chuàng)新互聯(lián)公司集小程序制作創(chuàng)意,網(wǎng)站制作策劃,畫冊、網(wǎng)頁、VI設(shè)計,網(wǎng)站、軟件、微信、小程序開發(fā)于一體。
名稱欄目:如何判斷MySQL數(shù)據(jù)庫是否建立了索引?(mysql數(shù)據(jù)庫判斷索引建立)
轉(zhuǎn)載來于:http://fisionsoft.com.cn/article/djgchgp.html


咨詢
建站咨詢
