成都創(chuàng)新互聯(lián)網(wǎng)站改版中如給廣大用戶帶來不便請諒解! 創(chuàng)新互聯(lián)專業(yè)成都網(wǎng)站建設 企業(yè)網(wǎng)站制作 精美網(wǎng)頁設計 網(wǎng)站建設服務熱線:028-869 2222 0
域名注冊
虛擬主機
網(wǎng)站建設
企業(yè)郵局
- 域名相關知識及購買
- 域名解析
- 網(wǎng)址URL轉發(fā)
- 轉入轉出及過戶
- 域名交易
網(wǎng)絡營銷
網(wǎng)站備案
- 域名相關知識及購買
- 域名解析
- 網(wǎng)址URL轉發(fā)
- 轉入轉出及過戶
- 域名交易
服務器租用
- 服務器相關知識
- 域名解析
- 網(wǎng)址URL轉發(fā)
- 轉入轉出及過戶
- 域名交易
淺談如何防止盜數(shù)據(jù)庫
- 作者:譚孝梅 文章來源:網(wǎng)站設計制作 點擊數(shù):1241 更新時間:2011-9-13
-
當你提交一個查詢的時候,MySQL數(shù)據(jù)庫會分析它,看是否可以做一些優(yōu)化使處理該查詢的速度更快。這一部分將介紹查詢優(yōu)化器是如何工作的。如果你想知道MySQL采用的優(yōu)化手段,可以查看MySQL參考手冊。
當然,MySQL查詢優(yōu)化器也利用了索引,但是它也使用了其它一些信息。例如,如果你提交如下所示的查詢,那么無論數(shù)據(jù)表有多大,MySQL執(zhí)行它的速度都會非常快:
SELECT * FROM tbl_name WHERE 0;
在這個例子中,MySQL查看WHERE子句,認識到?jīng)]有符合查詢條件的數(shù)據(jù)行,因此根本就不考慮搜索數(shù)據(jù)表。你可以通過提供一個EXPLAIN語句看到這種情況,這個語句讓MySQL顯示自己執(zhí)行的但實際上沒有真正地執(zhí)行的 SELECT查詢的一些信息。如果要使用EXPLAIN,只需要在EXPLAIN單詞放在SELECT語句的前面:
mysql> EXPLAIN SELECT * FROM tbl_name WHERE 0\G
***************************
1. row ***************************
id: 1
select_type: SIMPLE
table: NULL
type: NULL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: NULL
Extra: Impossible WHERE
通常情況下,EXPLAIN返回的信息比上面的信息要多一些,還包括用于掃描數(shù)據(jù)表的索引、使用的聯(lián)結類型、每張數(shù)據(jù)表中估計需要檢查的數(shù)據(jù)行數(shù)量等非空(NULL)信息。
優(yōu)化器是如何工作的 MySQL查詢優(yōu)化器有幾個目標,但是其中最主要的目標是盡可能地使用索引,并且使用最嚴格的索引來消除盡可能多的數(shù)據(jù)行。你的最終目標是提交SELECT語句查找數(shù)據(jù)行,而不是排除數(shù)據(jù)行。優(yōu)化器試圖排除數(shù)據(jù)行的原因在于它排除數(shù)據(jù)行的速度越快,那么找到與條件匹配的數(shù)據(jù)行也就越快。如果能夠首先進行最嚴格的測試,查詢就可以執(zhí)行地更快。假設你的查詢檢驗了兩個數(shù)據(jù)列,每個列上都有索 引:
SELECT col3 FROM mytable
WHERE col1 = ’some value’ AND col2 = ’some other value’;
假設col1上的測試匹配了900個數(shù)據(jù)行,col2上的測試匹配了300個數(shù)據(jù)行,而同時進行的測試只得到了30個數(shù)據(jù)行。先測試Col1會有900個數(shù)據(jù)行,需要檢查它們找到其中的30個與col2中的值匹配記錄,其中就有870 次是失敗了。先測試col2會有300個數(shù)據(jù)行,需要檢查它們找到其中的30個與col1中的值匹配的記錄,只有270次是失敗的,因此需要的計算和磁盤 I/O更少。其結果是,優(yōu)化器會先測試col2,因為這樣做開銷更小。
你可以通過下面一個指導幫助優(yōu)化器更好地利用索引:
盡量比較數(shù)據(jù)類型相同的數(shù)據(jù)列。當你在比較操作中使用索引數(shù)據(jù)列的時候,請使用數(shù)據(jù)類型相同的列。相同的數(shù)據(jù)類型比不同類型的性能要高一些。例如,INT與BIGINT是不同的。CHAR(10)被認為是CHAR(10)或 VARCHAR(10),但是與CHAR(12)或VARCHAR(12)不同。如果你所比較的數(shù)據(jù)列的類型不同,那么可以使用ALTER TABLE來修改其中一個,使它們的類型相匹配。
盡可能地讓索引列在比較表達式中獨立。如果你在函數(shù)調用或者更復雜的算術表達式條件中使用了某個數(shù)據(jù)列,MySQL就不會使用索引,因為它必須計算出每個數(shù)據(jù)行的表達式值。有時候這種情況無法避免,但是很多情況下你可以重新編寫一個查詢讓索引列獨立地出現(xiàn)。
下面的WHERE子句顯示了這種情況。它們的功能相同,但是對于優(yōu)化目標來說就有很大差異了:
WHERE mycol < 4 / 2
WHERE mycol * 2 < 4
對于第一行,優(yōu)化器把表達式4/2簡化為2,接著使用mycol上的索引來快速地查找小于2的值。對于第二個表達式,MySQL必須檢索出每個數(shù)據(jù)行的mycol值,乘以2,接著把結果與4進行比較。在這種情況下,不會使用索引。數(shù)據(jù)列中的每個值都必須被檢索到,這樣才能計算出比較表達式左邊的值。
我們看另外一個例子。假設你對date_col列進行了索引。如果你提交一條如下所示的查詢,就不會使用這個索引:
SELECT * FROM mytbl WHERE YEAR(date_col) < 1990;
這個表達式不會把1990與索引列進行比較;它會把1990與該數(shù)據(jù)列計算出來的值比較,而每個數(shù)據(jù)行都必須計算出這個值。其結果是,沒有使用date_col上的索引,因為執(zhí)行這樣的查詢需要全表掃描。怎么解決這個問題呢?只需要使用文本日期,接著就可以使用date_col上的索引來查找列 中匹配的值了:
WHERE date_col < ’1990-01-01’
但是,假設你沒有特定的日期。你可能希望找到一些與今天相隔固定的幾天的日期的記錄。表達這種類型的比較有很多種方法--它們的效率并不同。下面就有三種:
WHERE TO_DAYS(date_col) - TO_DAYS(CURDATE()) < cutoff
WHERE TO_DAYS(date_col) < cutoff + TO_DAYS(CURDATE())
WHERE date_col < DATE_ADD(CURDATE(), INTERVAL cutoff DAY)
對于第一行,不會用到索引,因為每個數(shù)據(jù)行都必須檢索以計算出TO_DAYS (date_col)的值。第二行要好一些。Cutoff和TO_DAYS(CURDATE())都是常量,因此在處理查詢之前,比較表達式的右邊可以被優(yōu)化器一次性計算出來,而不需要每個數(shù)據(jù)行都計算一次。但是date_col列仍然出現(xiàn)在函數(shù)調用中,它阻止了索引的使用。第三行是這幾個中最好的。同樣,在執(zhí)行查詢之前,比較表達式的右邊可以作為常量一次性計算出來,但是現(xiàn)在它的值是一個日期。這個值可以直接與date_col值進行比較,再也不需要轉換成天數(shù)了。在這種情況下,會使用索引。
在LIKE模式的開頭不要使用通配符。有些字符串搜索使用如下所示的WHERE子句:
WHERE col_name LIKE ’%string%’
如果你希望找到那些出現(xiàn)在數(shù)據(jù)列的任何位置的字符串,這個語句就是對的。但是不要因為習慣而簡單地把"%"放在字符串的兩邊。如果你在查找出現(xiàn)在數(shù)據(jù)列開頭的字符串,就刪掉前面的"%"。假設你要查找那些類似MacGregor或 MacDougall等以"Mac"開頭的名字。在這種情況下,WHERE子句如下所示:
WHERE last_name LIKE ’Mac%’
優(yōu)化器查看該模式中詞首的文本,并使用索引找到那些與下面的表達式匹配的數(shù)據(jù)行。下面的表達式是使用last_name索引的另一種形式:
WHERE last_name >= ’Mac’ AND last_name < ’Mad’
這種優(yōu)化不能應用于使用了REGEXP操作符的模式匹配。REGEXP表達式永遠不會被優(yōu)化。
幫助優(yōu)化器更好的判斷索引的效率。在默認情況下,當你把索引列的值與常量進行比較的時候,優(yōu)化器會假設鍵值在索引內部是均勻分布的。在決定進行常量比較是否使用索引的時候,優(yōu)化器會快速地檢查索引,估計出會用到多少個實體(entry)。對應MyISAM、InnoDB和BDB數(shù)據(jù)表來說,你可以使用ANALYZE TABLE讓服務器執(zhí)行對鍵值的分析。它會為優(yōu)化器提供更好的信息。
使用EXPLAIN驗證優(yōu)化器的操作。EXPLAIN語句可以告訴你是否使用了索引。當你試圖用另外的方式編寫語句或檢查添加索引是否會提高查詢執(zhí)行效率的時候,這些信息對你是有幫助的。
在必要的時候給優(yōu)化器一些提示。正常情況下,MySQL優(yōu)化器自由地決定掃描數(shù)據(jù)表的次序來最快地檢索數(shù)據(jù)行。在有些場合中優(yōu)化器沒有作出最佳選擇。如果你察覺這種現(xiàn)象發(fā)生了,就可以使用STRAIGHT_JOIN關鍵字來重載優(yōu)化器的選擇。帶有STRAIGHT_JOIN的聯(lián)結類似于交叉聯(lián)結,但是強迫數(shù)據(jù)表按照FROM子句中指定的次序來聯(lián)結。
在SELECT語句中有兩個地方可以指定STRAIGHT_JOIN。你可以在SELECT關鍵字和選擇列表之間的位置指定,這樣會對語句中所有的交叉聯(lián)結產生影響;你也可以在FROM子句中指定。下面的兩個語句功能相同:
SELECT STRAIGHT_JOIN ... FROM t1, t2, t3 ... ;
SELECT ... FROM t1 STRAIGHT_JOIN t2 STRAIGHT_JOIN t3 ... ;
分別在帶有STRAIGHT_JOIN和不帶STRAIGHT_JOIN的情況下運行這個查詢;MySQL可能因為什么原因沒有按照你認為最好的次序使用索引(你可以使用EXPLAIN來檢查MySQL處理每個語句的執(zhí)行計劃)。
你還可以使用FORCE INDEX、USE INDEX或IGNORE INDEX來指導服務器如何使用索引。
利用優(yōu)化器更加完善的區(qū)域。MySQL可以執(zhí)行聯(lián)結和子查詢,但是子查詢是最近才支持的,是在MySQL 4.1中添加的。因而在很多情況下,優(yōu)化器對聯(lián)結操作的調整比對子查詢的調整要好一些。當你的子查詢執(zhí)行地很慢的時候,這就是一條實際的提示。有一些子查詢可以使用邏輯上相等的聯(lián)結來重新表達。在可行的情況下,你可以把子查詢重新改寫為聯(lián)結,看是否執(zhí)行地快一些。
測試查詢的備用形式,多次運行。當你測試查詢的備用形式的時候(例如,子查詢與等同 的聯(lián)結操作對比),每種方式都應該多次運行。如果兩種形式都只運行了一次,那么你通常會發(fā)現(xiàn)第二個查詢比第一個快,這是因為第一個查詢得到的信息仍然保留在緩存中,以至于第二個查詢沒有真正地從磁盤上讀取數(shù)據(jù)。你還應該在系統(tǒng)負載相對平穩(wěn)的時候運行查詢,以避免系統(tǒng)中其它的事務影響結果。
避免過度地使用MySQL自動類型轉換。MySQL會執(zhí)行自動的類型轉換,但是如果你能夠避免這種轉換操作,你得到的性能就更好了。例如,如果num_col是整型數(shù)據(jù)列,那么下面這些查詢將返回相同的結果:
SELECT * FROM mytbl WHERE num_col = 4;
SELECT * FROM mytbl WHERE num_col = ’4’;
但是第二個查詢涉及到了類型轉換。轉換操作本身為了把整型和字符串型轉換為雙精度型進行比較,使性能惡化了。更嚴重的情況是,如果num_col是索引的,那么涉及到類型轉換的比較操作不會使用索引。
- 上一篇文章:換服務器IP對百度影響最小的技巧
下一篇文章:如何選擇一個有利推廣的虛擬空間
服務電話:028-86922220 13518219792 公司地址:成都市太升南路288號錦天國際A幢1002號
支持信箱:service@cdxwcx.com 版權所有:創(chuàng)新互聯(lián)-成都網(wǎng)站建設網(wǎng)絡公司 蜀ICP備13010860號
創(chuàng)新互聯(lián)成都網(wǎng)絡公司專業(yè)從事:成都網(wǎng)站設計,成都網(wǎng)站空間,成都網(wǎng)站建設,成都網(wǎng)頁制作,MySQL5.0新特性,MySQL5.0數(shù)據(jù)庫,MySQL5.0數(shù)據(jù)庫存儲過程,成都網(wǎng)站數(shù)據(jù)庫
亚洲综合香蕉在线视频|
好吊妞视频这里有精品|
国产精品久久精品毛片|
欧美日韩国产精品黄片|
九九热在线免费在线观看|
午夜福利网午夜福利网|
国产成人国产精品国产三级|
欧美午夜一级特黄大片|
色好吊视频这里只有精|
91在线播放在线播放观看|
国产内射一级二级三级|
亚洲av专区在线观看|
熟女高潮一区二区三区|
老司机激情五月天在线不卡|
久久精品亚洲欧美日韩|
亚洲一区二区三区四区性色av|
人妻巨大乳一二三区麻豆|
黑人巨大精品欧美一区二区区|
丰满少妇被粗大猛烈进出视频|
欧美一区二区黑人在线|
欧美日韩亚洲精品在线观看|
亚洲av日韩av高潮无打码|
国产午夜福利不卡片在线观看|
日本深夜福利视频在线|
婷婷一区二区三区四区|
色婷婷日本视频在线观看|
日本不卡在线视频你懂的
|
久久精品免费视看国产成人|
国产精品欧美一区二区三区不卡|
国产一级性生活录像片|
亚洲中文字幕在线观看黑人|
久久综合亚洲精品蜜桃|
办公室丝袜高跟秘书国产|
免费在线观看激情小视频|
久久99热成人网不卡|
亚洲精品中文字幕无限乱码|
国产精品一区二区三区黄色片|
国产一区二区三区精品免费|
日韩欧美一区二区不卡看片|
欧美不雅视频午夜福利|
99秋霞在线观看视频|