MySQL 5.0 數(shù)據(jù)庫新特性的存儲過程_MySQL教程
推薦:MySql管理的一點(diǎn)心得MySql數(shù)據(jù)庫是中小型網(wǎng)站后臺數(shù)據(jù)庫的首選,因?yàn)樗鼘Ψ巧虡I(yè)應(yīng)用是免費(fèi)的.網(wǎng)站開發(fā)者可以搭建一個(gè)Linux+Apache+PHP+MySql 平臺,這是一個(gè)最省錢的高效平臺.在使用MySql進(jìn)行開發(fā)時(shí),MySql自帶的文檔對于新手來說是份很好的參考資料.本文是我在使用MySql中的小小心得。 當(dāng)前
當(dāng)你提交一個(gè)查詢的時(shí)候,MySQL會分析它,看是否可以做一些優(yōu)化使處理該查詢的速度更快。這一部分將介紹查詢優(yōu)化器是如何工作的。如果你想知道MySQL采用的優(yōu)化手段,可以查看MySQL參考手冊。
當(dāng)然,MySQL查詢優(yōu)化器也利用了索引,但是它也使用了其它一些信息。例如,如果你提交如下所示的查詢,那么無論數(shù)據(jù)表有多大,MySQL執(zhí)行它的速度都會非�?欤�
SELECT * FROM tbl_name WHERE 0;
在這個(gè)例子中,MySQL查看WHERE子句,認(rèn)識到?jīng)]有符合查詢條件的數(shù)據(jù)行,因此根本就不考慮搜索數(shù)據(jù)表。你可以通過提供一個(gè)EXPLAIN語句看到這種情況,這個(gè)語句讓MySQL顯示自己執(zhí)行的但實(shí)際上沒有真正地執(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ù)表中估計(jì)需要檢查的數(shù)據(jù)行數(shù)量等非空(NULL)信息。
優(yōu)化器是如何工作的
MySQL查詢優(yōu)化器有幾個(gè)目標(biāo),但是其中最主要的目標(biāo)是盡可能地使用索引,并且使用最嚴(yán)格的索引來消除盡可能多的數(shù)據(jù)行。你的最終目標(biāo)是提交SELECT語句查找數(shù)據(jù)行,而不是排除數(shù)據(jù)行。優(yōu)化器試圖排除數(shù)據(jù)行的原因在于它排除數(shù)據(jù)行的速度越快,那么找到與條件匹配的數(shù)據(jù)行也就越快。如果能夠首先進(jìn)行最嚴(yán)格的測試,查詢就可以執(zhí)行地更快。假設(shè)你的查詢檢驗(yàn)了兩個(gè)數(shù)據(jù)列,每個(gè)列上都有索引:
SELECT col3 FROM mytable
WHERE col1 = ’some value’ AND col2 = ’some other value’;
假設(shè)col1上的測試匹配了900個(gè)數(shù)據(jù)行,col2上的測試匹配了300個(gè)數(shù)據(jù)行,而同時(shí)進(jìn)行的測試只得到了30個(gè)數(shù)據(jù)行。先測試Col1會有900個(gè)數(shù)據(jù)行,需要檢查它們找到其中的30個(gè)與col2中的值匹配記錄,其中就有870次是失敗了。先測試col2會有300個(gè)數(shù)據(jù)行,需要檢查它們找到其中的30個(gè)與col1中的值匹配的記錄,只有270次是失敗的,因此需要的計(jì)算和磁盤I/O更少。其結(jié)果是,優(yōu)化器會先測試col2,因?yàn)檫@樣做開銷更小。
你可以通過下面一個(gè)指導(dǎo)幫助優(yōu)化器更好地利用索引:
盡量比較數(shù)據(jù)類型相同的數(shù)據(jù)列。當(dāng)你在比較操作中使用索引數(shù)據(jù)列的時(shí)候,請使用數(shù)據(jù)類型相同的列。相同的數(shù)據(jù)類型比不同類型的性能要高一些。例如,INT與BIGINT是不同的。CHAR(10)被認(rèn)為是CHAR(10)或VARCHAR(10),但是與CHAR(12)或VARCHAR(12)不同。如果你所比較的數(shù)據(jù)列的類型不同,那么可以使用ALTER TABLE來修改其中一個(gè),使它們的類型相匹配。
盡可能地讓索引列在比較表達(dá)式中獨(dú)立。如果你在函數(shù)調(diào)用或者更復(fù)雜的算術(shù)表達(dá)式條件中使用了某個(gè)數(shù)據(jù)列,MySQL就不會使用索引,因?yàn)樗仨氂?jì)算出每個(gè)數(shù)據(jù)行的表達(dá)式值。有時(shí)候這種情況無法避免,但是很多情況下你可以重新編寫一個(gè)查詢讓索引列獨(dú)立地出現(xiàn)。
下面的WHERE子句顯示了這種情況。它們的功能相同,但是對于優(yōu)化目標(biāo)來說就有很大差異了:
WHERE mycol < 4 / 2
WHERE mycol * 2 < 4
對于第一行,優(yōu)化器把表達(dá)式4/2簡化為2,接著使用mycol上的索引來快速地查找小于2的值。對于第二個(gè)表達(dá)式,MySQL必須檢索出每個(gè)數(shù)據(jù)行的mycol值,乘以2,接著把結(jié)果與4進(jìn)行比較。在這種情況下,不會使用索引。數(shù)據(jù)列中的每個(gè)值都必須被檢索到,這樣才能計(jì)算出比較表達(dá)式左邊的值。
分享:mysql導(dǎo)入數(shù)據(jù)庫文件最大限制的修改方法自己電腦上裝的WAMP,在導(dǎo)入數(shù)據(jù)庫比較大(大于2M)時(shí)遇到錯(cuò)誤,不能導(dǎo)入。 找到解決方法: php.ini配置文件中有三處地方需要改動: upload_max_filesize memory_limit post_max_size 這三個(gè)值都工具實(shí)際情況改下,重啟服務(wù)器以后,雖然導(dǎo)入時(shí)仍然顯示是 最大限制:2,048
- MySql管理的一點(diǎn)心得
- mysql導(dǎo)入數(shù)據(jù)庫文件最大限制的修改方法
- Mysql存儲引擎InnoDB和Myisam的六大區(qū)別
- Mysql運(yùn)行環(huán)境優(yōu)化(Linux系統(tǒng))
- MySQL查詢的性能優(yōu)化基礎(chǔ)教程
- MySQL 在windows上的安裝詳細(xì)介紹
- sql server 2005時(shí)發(fā)生18452錯(cuò)誤解決方法
- MySQL字段的取值范圍
- mysql_unbuffered_query與mysql_query的區(qū)別
- mysql 復(fù)制表數(shù)據(jù),表結(jié)構(gòu)的3種方法
- mysql存儲過程,實(shí)現(xiàn)兩個(gè)游標(biāo)的循環(huán)
- MYSQL的導(dǎo)入導(dǎo)出與還原備份
MySQL教程Rss訂閱編程教程搜索
MySQL教程推薦
猜你也喜歡看這些
- 如何在SQL Server中去除表中不可見字符
- 數(shù)據(jù)庫用SQL語法大全
- 怎樣清除SQL Server日志
- 解析SQL Server 2005實(shí)現(xiàn)數(shù)據(jù)庫緩存依賴
- 解決SQL查詢中的轉(zhuǎn)義序列不對的方法
- SqlServer獲取存儲過程返回值的實(shí)例
- 深入淺出SQL之左連接、右連接和全連接
- SQL Server 2005 DTS導(dǎo)入平面數(shù)據(jù)出現(xiàn)錯(cuò)誤解決方案
- SQL Server 游標(biāo)語句 聲明/打開/循環(huán)實(shí)例
- SQL Server 數(shù)據(jù)庫恢復(fù)日志功能
- 相關(guān)鏈接:
- 教程說明:
MySQL教程-MySQL 5.0 數(shù)據(jù)庫新特性的存儲過程
。