自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL查詢優(yōu)化器的工作原理

數(shù)據(jù)庫 MySQL
MySQL如何提高查詢效率是每一個(gè)DBA都經(jīng)常要思考的問題,而查詢優(yōu)化器正是幫助我們解決此問題的有力武器。

MySQL查詢優(yōu)化器可以讓我們的MySQL數(shù)據(jù)庫查詢效率更高,下面就為您分析MySQL查詢優(yōu)化器的工作原理,供您參考學(xué)習(xí)之用。

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

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

  1. SELECT * FROM tbl_name WHERE 0;  
  2.  

在這個(gè)例子中,MySQL查看WHERE子句,認(rèn)識到?jīng)]有符合查詢條件的數(shù)據(jù)行,因此根本就不考慮搜索數(shù)據(jù)表。你可以通過提供一個(gè)EXPLAIN語句看到這種情況,這個(gè)語句讓MySQL顯示自己執(zhí)行的但實(shí)際上沒有真正地執(zhí)行的SELECT查詢的一些信息。如果要使用EXPLAIN,只需要在EXPLAIN單詞放在SELECT語句的前面:

  1. mysql> EXPLAIN SELECT * FROM tbl_name WHERE 0\G  
  2. *************************** 1. row ***************************  
  3. id: 1  
  4. select_type: SIMPLE  
  5. table: NULL  
  6. type: NULL  
  7. possible_keys: NULL  
  8. key: NULL  
  9. key_len: NULL  
  10. ref: NULL  
  11. rows: NULL  
  12. Extra: Impossible WHERE   
  13.  

通常情況下,EXPLAIN返回的信息比上面的信息要多一些,還包括用于掃描數(shù)據(jù)表的索引、使用的聯(lián)結(jié)類型、每張數(shù)據(jù)表中估計(jì)需要檢查的數(shù)據(jù)行數(shù)量等非空(NULL)信息。

MySQL查詢優(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è)列上都有索引:

  1. SELECT col3 FROM mytable  
  2. 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è),使它們的類型相匹配。
 

 

【編輯推薦】

MySQL無重復(fù)查詢的實(shí)現(xiàn)

MySQL中SELECT命令的特殊用法

mysql命令行參數(shù)簡介

MySQL條件查詢語句的用法

使用Limit參數(shù)實(shí)現(xiàn)MySQL查詢優(yōu)化

 

責(zé)任編輯:段燃 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2010-06-12 15:31:04

MySQL查詢優(yōu)化

2010-11-25 14:21:16

MySQL查詢分頁

2019-05-17 11:53:58

MySQLorder by數(shù)據(jù)庫

2016-12-13 22:51:08

androidmultidex

2009-09-16 18:02:13

WSUS服務(wù)器

2010-10-14 16:27:56

MySQL隨機(jī)查詢

2010-10-27 14:57:24

Oracle查詢

2018-06-07 08:54:01

MySQL性能優(yōu)化索引

2013-12-19 14:04:18

MySQLMySQL優(yōu)化

2025-01-15 12:48:30

2021-06-03 19:55:55

MySQ查詢優(yōu)化

2018-05-23 13:47:28

數(shù)據(jù)庫PostgreSQL查詢優(yōu)化

2018-05-25 15:04:57

數(shù)據(jù)庫PostgreSQL查詢優(yōu)化器

2024-02-29 09:28:19

2024-02-20 14:53:01

2009-09-24 10:41:35

打印服務(wù)器

2009-11-13 17:19:10

2010-09-25 13:25:55

DHCP服務(wù)器工作原理

2011-04-07 15:32:25

2010-05-18 17:32:33

MySQL查詢優(yōu)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號