MySQL 5.0 數(shù)據(jù)庫新特性的存儲過程
來源:易賢網(wǎng) 閱讀:835 次 日期:2015-02-06 15:35:50
溫馨提示:易賢網(wǎng)小編為您整理了“MySQL 5.0 數(shù)據(jù)庫新特性的存儲過程”,方便廣大網(wǎng)友查閱!

當(dāng)你提交一個查詢的時候,MySQL會分析它,看是否可以做一些優(yōu)化使處理該查詢的速度更快。這一部分將介紹查詢優(yōu)化器是如何工作的。如果你想知道MySQL采用的優(yōu)化手段,可以查看MySQL參考手冊。

當(dāng)然,MySQL查詢優(yōu)化器也利用了索引,但是它也使用了其它一些信息。例如,如果你提交如下所示的查詢,那么無論數(shù)據(jù)表有多大,MySQL執(zhí)行它的速度都會非??欤?/P>

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)結(jié)類型、每張數(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è)你的查詢檢驗了兩個數(shù)據(jù)列,每個列上都有索引:

SELECT col3 FROM mytable

WHERE col1 = ’some value’ AND col2 = ’some other value’;

假設(shè)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更少。其結(jié)果是,優(yōu)化器會先測試col2,因為這樣做開銷更小。

你可以通過下面一個指導(dǎo)幫助優(yōu)化器更好地利用索引:

盡量比較數(shù)據(jù)類型相同的數(shù)據(jù)列。當(dāng)你在比較操作中使用索引數(shù)據(jù)列的時候,請使用數(shù)據(jù)類型相同的列。相同的數(shù)據(jù)類型比不同類型的性能要高一些。例如,INT與BIGINT是不同的。CHAR(10)被認為是CHAR(10)或VARCHAR(10),但是與CHAR(12)或VARCHAR(12)不同。如果你所比較的數(shù)據(jù)列的類型不同,那么可以使用ALTER TABLE來修改其中一個,使它們的類型相匹配。

盡可能地讓索引列在比較表達式中獨立。如果你在函數(shù)調(diào)用或者更復(fù)雜的算術(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,接著把結(jié)果與4進行比較。在這種情況下,不會使用索引。數(shù)據(jù)列中的每個值都必須被檢索到,這樣才能計算出比較表達式左邊的值。

更多信息請查看IT技術(shù)專欄

更多信息請查看數(shù)據(jù)庫
易賢網(wǎng)手機網(wǎng)站地址:MySQL 5.0 數(shù)據(jù)庫新特性的存儲過程
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇剩?/div>

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)