MySQL优化器中一个Count和覆盖索引的问题_MySQL
bitsCN.com
MySQL优化器中一个Count和覆盖索引的问题
现象说明
其实这里主要要说明的是一个优化器还需要改进的地方。
优化器会根据where条件和select_list里面的字段决定在使用一个索引(sta)后,是否需要回表—回到聚集索引取数据。
基本的做法是:在确定了一个索引后,将select_list和where中出现的所有字段都拿来判断一下,如果字段都存在于sta索引中,则可以使用覆盖索引。
第一个explan可以用上覆盖索引(Using Index), 是因为select_list里面只有count(*),而count(*)在语法解析阶段就被特殊处理,不作为特殊字段。
第二个字段在现在的实现中,因为gmt不是sta索引的一部分(sta索引定义上只有sta一个字段,算上聚集索引结构,就是sta,auci)。所以最后判定为不能使用覆盖索引。
性能差别
表中放入500w数据以后,这两个查询的时间相差25倍(0.19s vs 5s)。
存在改进
其实我说这个“不科学”,是因为第二个语句居然不能使用覆盖索引。按照count(gmt)的语义,是计算gmt不为NULL的所有行的数目。但是表定义中,分分明已经说明了gmt为not null。那么就可以转成count(*)了!
目前因为count、sum、count(distinct)这些操作的处理方法被揉在一起,因此没有特别分开。
应用警惕
好在按照正常的习惯,需要计算总数时,最多是count(auci)或者count(*), 不会故意去count一个别的字段。当时若使用的是MyISAM,就需要小心了。
从上面的分析可以推测得到,如果这是个MyISAM表,还是一样的where条件,count(*)是可以使用覆盖索引的,但是count(auci)就不行了。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel集合中的Where方法實用指南在Laravel框架的開發過程中,集合(Collection)是一個非常有用的資料結構,它提供了豐富的方法來操作資料。其中,Where方法是常用的篩選方法,能夠根據指定條件來過濾集合中的元素。本文將介紹Laravel集合中Where方法的使用,透過具體的程式碼範例來示範其用法。 1.基本用法Where方法的

Laravel集合中如何使用Where方法Laravel是一個流行的PHP框架,它提供了豐富的功能和工具,方便開發者快速建立應用程式。其中,集合(Collection)是Laravel中一個非常實用且強大的資料結構,開發者可以使用集合對資料進行各種操作,例如過濾、映射、排序等。在集合中,Where方法是一個常用的方法,用於根據指定的條件過濾集

從入門到精通:掌握is與where選擇器的使用技巧引言:在進行資料處理與分析的過程中,選擇器(selector)是一項非常重要的工具。透過選擇器,我們可以按照特定的條件從資料集中提取所需的資料。本文將介紹is和where選擇器的使用技巧,幫助讀者快速掌握這兩個選擇器的強大功能。一、is選擇器的使用is選擇器是一種基本的選擇器,它允許我們根據給定條件對資料集進

前言我們在寫sql語句的時候,總是無法避免使用到連接關鍵字,例如內連接、外連接。種類是很多的,我在這裡貼上一張在別處找到的圖:這張圖我認為是非常詳細了,它展示出了SQL語句中常見的鏈接類型,以本文中的leftjoin為例,網上是這麼給定義的:LEFTJOIN關鍵字會從左表傳回所有的行,即使在右表中沒有符合的行。其實光從字面意思上來說的話,leftjoin是比較好理解的,但是在使用的過程中,還是會有一些問題的,比如條件在on後面與在where後面,他們的結果是完全不一樣的,接下來我們就從淺到深

Laravel是一款受歡迎的PHP開發框架,它提供了豐富且便利的功能,其中集合(Collection)是Laravel中非常重要的資料結構之一。集合類別提供了許多強大的方法,其中一個常用的方法是where方法。本文將透過具體的程式碼範例來解析Laravel集合中的where方法用法。 1.建立集合首先,我們需要建立一個包含一些資料的集合。可以

Laravel中where方法的常見錯誤及解決方法在使用Laravel框架進行開發的過程中,我們經常使用到EloquentORM來操作資料庫。其中,where方法是一個非常常用的方法,用來篩選資料庫中的資料。然而,由於對Laravel框架不夠熟悉或對EloquentORM理解不深,很容易在使用where方法時出現一些常見的錯誤。本文將介紹幾種常見的w

Laravel是一款流行的PHP框架,其集合(Collections)類別提供了強大的資料處理功能。其中,Where方法是集合類別中常用的方法之一,用於篩選符合條件的資料。本文將詳細介紹Laravel集合的Where方法,包括使用方法、參數意義以及具體的程式碼範例。一、Where方法概述Where方法用於篩選集合中符合指定條件的元素,並傳回一個

SQLWHERE子句WHERE子句用來規定選擇的標準。如需有條件地從表格中選取數據,可將WHERE子句新增至SELECT語句。語法如下:SELECT欄位名稱FROM表名稱WHERE列運算子值下面的運算子可在WHERE子句中使用:=:等於:不等於>:大於=:大於等於1965
