groupby索引有效嗎_SQL IN 一定走索引嗎?

摘要

IN 一定走索引嗎?那當然了,不走索引還能全部掃描嗎?好像之前有看到過什么Exist,IN走不走索引的討論。但是好像看的太久了,又忘記了。哈哈,如果你也忘記了MySQL中IN是如何查詢的,就來復習下吧。

問題

問題要從之前的統計 店鋪數關注人數說起

73e29cea06bcdc8b1a5040df842fd4a6.png

當時是從緩存的角度來分析如何進行優化。有興趣看這篇微服務化后緩存怎么做

將這個查詢收斂,應用端做了緩存后,確實沒什么大問題了。但是隨著店鋪關注數的增加,慢SQL開始出現了

在我們的業務中,將100ms的SQL查詢定義為慢查詢,需要優化的。優化不了必須要控制查詢頻次。同時超過5s的數據庫操作會被kill掉,防止拖垮整個數據庫,導致相關應用都受到牽連。

該SQL執行時間耗時已經幾百ms了,必須要優化了。阿里云對這個SQL的檢測報告時

掃描行數和返回行數比例超過了100使用了groupby函數,注意檢查groupby是否用到了索引

分析

首先可以確定的是,group by 的 shop_id字段肯定是建了索引的,那么掃描行數和返回行數比例為什么這么大呢?

先復習下分析查詢語句的三大要素

  • 響應時間,意思很明確,不多解釋了
  • 掃描行數 整個查詢過程中掃描了多少行
  • 返回行數 查詢結果命中的行數 一般來說掃描行數和返回行數一樣,是最好的,但是這是理想情況,事實并非如此。關聯查詢/范圍排序查詢時都會使得掃描行數大于返回行數。一般這個比例要控制在10以下,否則可能會有性能問題。

題外話,我一直覺得mysql explain的展示字段不如mongo的直觀。mongo索引原理同mysql一樣,有興趣的可以看下Mongo Index分析

那么現在問題來了,為什么這個查詢掃描行數/返回行數比例這么大呢。

那么就explain 一下了

實驗1

6fe0f576cde510b8cef2bba1c9f5e9ee.png

結果

b47ad02a8b91a6b5bd3cb05c473c2389.png

和我預想的一樣,類型是 range走了shopId的索引,沒毛病。那怎么掃描行數/返回行數比例這么大的。

實驗2

再試一把,將IN的范圍增大了。

9f280b6c7ef4a4436dc8f1273fd14736.png

結果

9dab9f064b783d3c50bdc49e7205916c.png

結果不一樣了,類型是 index,也就是沒有走范圍掃描,而是走的是索引掃描。

實驗3

強制走索引

a10498e00a59d9c6fdb28093548bccd7.png

結果

2d1e4afecd6505b47f4b82d29b7bc7b3.png

這時候走的是范圍掃描,而不是索引掃描。但是你會發現這次的執行時間并不沒有比·上一次的執行時間短

mysql對這個查詢進行了優化,使其不走范圍掃描。而是走的是索引掃描。那么必然會隨著IN的條件越來越多, 掃描的行數越多,執行的時間越長。

所以這個問題的優化的辦法呢,就是在應用端做切割,分批去查。每次查N個,保證每次的查詢都很快。

總結

根據實際的情況,需要控制IN查詢的范圍。原因有以下幾點

  1. IN 的條件過多,會導致索引失效,走索引掃描
  2. IN 的條件過多,返回的數據會很多,可能會導致應用堆內內存溢出。

所以必須要控制好IN的查詢個數

點擊了解更多獲取更多Java進階知識 !!!

↓↓↓↓↓↓

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539139.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql函數使用場景_mysql的函數和存儲過程的比較,以及在實際場景中的使用案例...

一.存儲過程和函數的區別函數調用有返回值存儲過程調用用call語句,函數調用直接飲用函數名參數IN,OUT,INOUT只適用于存儲過程,對函數而言所有參數默認都是輸入參數IN用于把數值傳入到存儲過程中OUT用于輸出參數將數值傳遞給調用者…

hive性能調優

原文:http://www.tuicool.com/articles/rMvQvm ---------------------------------------------------------------------- limit 限制調整 -- 因為使用 limit 語句時候,是先執行整個查詢語句,然后再返回部分結果的 set hive.limit.optimize…

推薦系統之 BPR 算法及 Librec的BPR算法實現【1】

【推薦系統之 BPR 算法】 1、關于BPR的論文原文: BPR: Bayesian Personalized Ranking from Implicit Feedback 2、參考1:論文快讀 - BPR: Bayesian Personalized Ranking from Implicit Feedback (該博主的網站不錯,尤其論文快…

ios 篩選_萬千網友讓quot;低調使用quot;的軟件!居然還支持iOS

點擊藍字關注我們昨天的耳朵神器大家感覺怎么樣?享受了耳朵今天我們享受一下眼睛~可能很多同學對漫畫是情有獨鐘但是,之前小黑一直介紹的都是安卓端的軟件今天要給大家介紹的這款軟件是IOS安卓都有終于可以不被IOS的同學吐槽了而且經過測試小黑真的想說一…

Linux卸載/刪除多余網卡

卸載 使用命令ifconfig命令查看網卡情況 確認自己使用的是哪一塊網卡,然后把其它的網卡都卸載掉。 運行命令ifconfig 網卡名稱 down。 如: ifconfig eth1 down 再次運行ifconfig就會發現被卸載掉的網卡沒了。現在可以ping 一下內網的IP試試看能不能pin…

CentOS7:JDK1.7.0_80安裝

一、安裝前檢查 執行以下命令: rpm -qa | grep jdk 查看系統是否已經自帶openjdk,如果存在 執行以下命令: yum -y remove files files為查出的、系統自帶的openjdk相關文件,運行以上命令將相關文件卸載 執行命令 java -version[rootlocalhost…

python海龜繪圖畫圣誕帽男人_python海龜繪圖實例教程

本文以實例形式介紹了python turtle模塊即海龜繪圖的使用方法,對于需要進行圖形編程的朋友相信會有一定的借鑒價值。python turtle模塊簡介:python2.6版本中引入的一個簡單的繪圖工具,叫做海龜繪圖(turtle graphics)1.使用海龜繪圖首先我們需…

spring+mybatis 多數據源整合

原文&#xff1a;http://blog.csdn.net/fhx007/article/details/12530735 ---------------------------------------------------------------------------------- 直接看spring的配置吧 <!-- 數據源配置 --> <bean id"ds1" class"org.apache.commo…

四管前級怎么去掉高低音音調_一些歌曲音調太高怎么才能唱上去??

展開全部首先得提高肺活量 然后就是練聲&#xff01;怎 樣 練 聲&#xff1a;練聲的目的1&#xff0c;使歌唱發聲系統各器官的肌肉更e68a84e8a2ad62616964757a686964616f31333236373231有力&#xff0c;并能協調一致。2&#xff0c;建立正確的聲音概念。3&#xff0c;擴展音域&…

python繪制星空_用python畫星空源代碼是什么?

用python畫星空源代碼是什么&#xff1f;用python畫星空源代碼是from turtle import *from random import random,randintscreen Screen()width ,height 800,600screen.setup(width,height)screen.title("模擬3D星空")screen.bgcolor("black")screen.mod…

Linux - xshell上傳文件報錯亂碼

xshell上傳文件報錯亂碼&#xff0c;解決方法 rz -be 回車 下載sz filename轉載于:https://www.cnblogs.com/RzCong/p/8600899.html

java元數據是什么_用存儲過程和 JAVA 寫報表數據源有什么弊端?

用存儲過程和 JAVA 寫報表數據源有什么弊端&#xff1f;跟著小編一起來一看一下吧&#xff01;我們在報表開發中經常會使用存儲過程準備數據&#xff0c;存儲過程支持分步計算&#xff0c;可以實現非常復雜的計算邏輯&#xff0c;為報表開發帶來便利。所以&#xff0c;報表開發…

mysql多實例安裝啟動_MySQL多實例安裝啟動

Tips&#xff1a;之前我們的一個實例是mysql3306&#xff0c;我們現在再安裝一個mysql33071。和之前一樣&#xff0c;創建需要的目錄文件夾mkdir -p /data/mysql/mysql3307/{data,logs,tmp}創建完 就給文件授權chown -R mysql:mysql /data/mysql/mysql3307/2.進入mysql3307cd /…

用vhdl實現4位加減法計數器_32位加減法器設計

功能特性設計思路基于一位全加器&#xff0c;設計32位并行加法器。并行加法器中全加器的位數與操作數相同&#xff0c;影響速度&#xff08;延時&#xff09;的主要因素是進位信號的傳遞。主要的高速加法器【1】有基本上都是在超前進位加法器&#xff08;CLA&#xff09;的基礎…

用vim + xdebug 來追蹤thinkphp的執行過程

tree命令的使用幾個有實際應用的參數 -a 這是默認的 -d: 只顯式目錄, 不需要顯式目錄下的文件 -L: 列出顯式的深度. 當前目錄下的所有東西為第一級...在tp下, 有多個Common但是它們的含義不同:Application|- Common (前后臺都使用的公共文件所在目錄)|- Common (公共函數目錄)…

mybatis 中#與$的區別

MyBatis/Ibatis中#和$的區別 #{} 解析的是占位符&#xff1f;可以防止SQL注入&#xff0c;比如打印出來的語句 select * from table where id? 然而${} 則是不能防止SQL注入打印出來的語句 select * from table where id2 實實在在的參數

綠色背景配什么顏色文字_灰色褲子配什么顏色上衣好看

我們許多人都喜歡灰色。灰色是一種很酷的自然色。灰色大氣而沉穩。它介于黑白之間&#xff0c;是一種多用途的顏色&#xff0c;與其他顏色搭配將變得時尚而優雅。那么秋冬季節灰色褲子配什么顏色的上衣好看呢&#xff1f;接下來就來看一組時尚大人的灰色褲子穿搭吧。look1 保溫…

浮柵場效應管 符號_場效應管主要參數與特點,場效應管與其他管子的對比

場效應晶體管(Field Effect Transistor縮寫(FET))簡稱場效應管。主要有兩種類型&#xff1a;結型場效應管(junction FET—JFET)和金屬-氧化物半導體場效應管(metal-oxide semiconductor FET&#xff0c;簡稱MOS-FET)。場效應管由多數載流子參與導電&#xff0c;也稱為單極型晶體…

linux軟鏈接

原文地址&#xff1a;http://biyutong.iteye.com/blog/1445699 ------------------------------------------------------------------------ 實例&#xff1a;ln -s /home/gamestat /gamestat linux下的軟鏈接類似于windows下的快捷方式 ln -s a b 中的 a 就是源文件&am…

MySQL主鍵自增長報duplicate_MySQL使用on duplicate key update引起主鍵不連續自增

innodb_autoinc_lock_mode中有3種模式,0,1,2&#xff0c;數據庫默認是1的情況下,每次使用insert into … on duplicate key update 的時候都會把簡單自增id增加,不管是發生了insert還是updateinnodb_autoinc_lock_mode參數詳解tradition(innodb_autoinc_lock_mode0) 模式&#…