Mysql如何避免全表掃描的方法
更新時(shí)間:2008年10月18日 01:28:20 作者:
如果MySQL需要做一次全表掃描來(lái)處理查詢時(shí),在 EXPLAIN 的結(jié)果中 type 字段的值是 ALL。
在以下幾種條件下,MySQL就會(huì)做全表掃描:
1>數(shù)據(jù)表是在太小了,做一次全表掃描比做索引鍵的查找來(lái)得快多了。當(dāng)表的記錄總數(shù)小于10且記錄長(zhǎng)度比較短時(shí)通常這么做。
2>沒(méi)有合適用于 ON 或 WHERE 分句的索引字段。
3>讓索引字段和常量值比較,MySQL已經(jīng)計(jì)算(基于索引樹(shù))到常量覆蓋了數(shù)據(jù)表的很大部分,因此做全表掃描應(yīng)該會(huì)來(lái)得更快。
4>通過(guò)其他字段使用了一個(gè)基數(shù)很小(很多記錄匹配索引鍵值)的索引鍵。這種情況下,MySQL認(rèn)為使用索引鍵需要大量查找,還不如全表掃描來(lái)得更快。
對(duì)于小表來(lái)說(shuō),全表掃描通常更合適。但是對(duì)大表來(lái)說(shuō),嘗試使用以下技術(shù)來(lái)避免讓優(yōu)化程序錯(cuò)誤地選擇全表掃描:
1>執(zhí)行 ANALYZE TABLE tbl_name 更新要掃描的表的索引鍵分布。
2> 使用 FORCE INDEX 告訴MySQL,做全表掃描的話會(huì)比利用給定的索引更浪費(fèi)資源。
SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
WHERE t1.col_name=t2.col_name;
3>啟動(dòng) mysqld 時(shí)使用參數(shù) --max-seeks-for-key=1000 或者執(zhí)行 SET max_seeks_for_key=1000 來(lái)告訴優(yōu)化程序,所有的索引都不會(huì)導(dǎo)致超過(guò)1000次的索引搜索。
1>數(shù)據(jù)表是在太小了,做一次全表掃描比做索引鍵的查找來(lái)得快多了。當(dāng)表的記錄總數(shù)小于10且記錄長(zhǎng)度比較短時(shí)通常這么做。
2>沒(méi)有合適用于 ON 或 WHERE 分句的索引字段。
3>讓索引字段和常量值比較,MySQL已經(jīng)計(jì)算(基于索引樹(shù))到常量覆蓋了數(shù)據(jù)表的很大部分,因此做全表掃描應(yīng)該會(huì)來(lái)得更快。
4>通過(guò)其他字段使用了一個(gè)基數(shù)很小(很多記錄匹配索引鍵值)的索引鍵。這種情況下,MySQL認(rèn)為使用索引鍵需要大量查找,還不如全表掃描來(lái)得更快。
對(duì)于小表來(lái)說(shuō),全表掃描通常更合適。但是對(duì)大表來(lái)說(shuō),嘗試使用以下技術(shù)來(lái)避免讓優(yōu)化程序錯(cuò)誤地選擇全表掃描:
1>執(zhí)行 ANALYZE TABLE tbl_name 更新要掃描的表的索引鍵分布。
2> 使用 FORCE INDEX 告訴MySQL,做全表掃描的話會(huì)比利用給定的索引更浪費(fèi)資源。
SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
WHERE t1.col_name=t2.col_name;
3>啟動(dòng) mysqld 時(shí)使用參數(shù) --max-seeks-for-key=1000 或者執(zhí)行 SET max_seeks_for_key=1000 來(lái)告訴優(yōu)化程序,所有的索引都不會(huì)導(dǎo)致超過(guò)1000次的索引搜索。
相關(guān)文章
MySQL中UPDATE語(yǔ)句使用的實(shí)例教程
這篇文章主要介紹了MySQL中UPDATE語(yǔ)句使用的實(shí)例教程,包括UPDATE的使用中所容易引起的性能問(wèn)題的分析,需要的朋友可以參考下2015-11-11如何把ACCESS的數(shù)據(jù)導(dǎo)入到Mysql中
如何把ACCESS的數(shù)據(jù)導(dǎo)入到Mysql中...2006-12-12mysql實(shí)現(xiàn)查詢每門課程成績(jī)最好的前兩名學(xué)生id和姓名
這篇文章主要介紹了mysql實(shí)現(xiàn)查詢每門課程成績(jī)最好的前兩名學(xué)生id和姓名方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11詳細(xì)深入聊一聊Mysql中的int(1)和int(11)
mysql數(shù)據(jù)庫(kù)作為當(dāng)前常用的關(guān)系型數(shù)據(jù)庫(kù),肯定會(huì)遇到設(shè)計(jì)表的需求,下面對(duì)設(shè)計(jì)表時(shí)int類型的設(shè)置進(jìn)行分析,下面這篇文章主要給大家介紹了關(guān)于Mysql中int(1)和int(11)的相關(guān)資料,需要的朋友可以參考下2022-08-08Mysql實(shí)現(xiàn)企業(yè)級(jí)日志管理、備份與恢復(fù)的實(shí)戰(zhàn)教程
下面小編就為大家分享一篇Mysql實(shí)現(xiàn)企業(yè)級(jí)日志管理、備份與恢復(fù)的實(shí)戰(zhàn)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12