欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一次Mysql使用IN大數(shù)據(jù)量的優(yōu)化記錄

 更新時間:2020年09月28日 08:51:42   作者:chenjunbiao  
這篇文章主要給大家介紹了關(guān)于Mysql使用IN大數(shù)據(jù)量的優(yōu)化的實(shí)戰(zhàn)記錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

mysql版本號是5.7.28,表A有390W條記錄,使用InnoDB引擎,其中varchar類型字段mac已建立索引,索引方法為B-tree。B表僅有5000+條記錄。

有一條SQL指令是這樣寫的:

SELECT * FROM A WHERE mac IN("aa:aa:aa:aa:aa:aa","bb:bb:bb:bb:bb:b",...此外省略900+條)

通過查詢出來的結(jié)果耗時294.428s。沒錯,將近5分鐘。

使用EXPLAIN分析下:

訪問類型type是range,且已命中索引,rows行也只有587776,可為什么查詢耗時要這么久?

mac的索引方法使用了B-tree,那對比下它與HASH的區(qū)別,簡單地總結(jié)下:B-tree索引可以用于進(jìn)行 =,>,>=,<,<=和between的計算,而HASH只能進(jìn)行等值運(yùn)算,不能進(jìn)行范圍查找。那IN是等值運(yùn)算,兩種索引方法都適用。即然這樣,把mac的索引方法修改為HASH,同樣的查詢耗時為。

既然調(diào)整索引方法并不能明顯地提升語句的查詢性能,那只能從語句本身中進(jìn)行處理。其實(shí)明眼人剛開始一看就知道,SELECT * 是很耗性能的,那我們只查業(yè)務(wù)上需要的字段,語句調(diào)整為:

SELECT id,mileage FROM A WHERE mac IN("aa:aa:aa:aa:aa:aa","bb:bb:bb:bb:bb:b",...此外省略900+條)

耗時并沒有明顯的提升。

竟然IN的方式這么難優(yōu)化,是不是可以放棄使用LEFT JOIN呢?語句調(diào)整為:

SELECT a.id,a.mileage FROM A a LEFT JOIN B b ON b.mac = a.mac WHERE b.create_time >= '2020-01-01'

耗時超過5分鐘,放棄。

我們知道,在條件量少的情況,EXISTS和IN的效果沒有顯示的差別。但條件多的時候,IN要比EXISTS的效率也高,來試下EXISTS:

SELECT id,mileage FROM A a WHERE EXISTS(SELECT mac FROM B WHERE create_time >= '2020-01-01' AND mac = a.mac)

耗時也是超過5分鐘,IN的效率確實(shí)要比EXISTS高,放棄。

所以最后的結(jié)論是,如果IN后接大數(shù)據(jù)量的String,要慎重。

在項目中我把mac作為唯一標(biāo)識建立與id的對應(yīng)表,在A表使用mac_id代替mac,查詢的時候使用IN(1,2,3...)。效率會提高一些。當(dāng)前使用NoSQL也是一種方式。

總結(jié)

到此這篇關(guān)于一次Mysql使用IN大數(shù)據(jù)量優(yōu)化的文章就介紹到這了,更多相關(guān)Mysql使用IN大數(shù)據(jù)量優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql?8.0解壓版下載安裝以及配置的實(shí)例教程

    Mysql?8.0解壓版下載安裝以及配置的實(shí)例教程

    MySQL的安裝分為兩種,一種是安裝版本,一種是免安裝解壓版本,一般老師都會推薦免安裝解壓版本,用起來更方便些,下面這篇文章主要給大家介紹了關(guān)于Mysql?8.0解壓版下載安裝以及配置的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 讓MySQL支持中文排序的實(shí)現(xiàn)方法

    讓MySQL支持中文排序的實(shí)現(xiàn)方法

    編繹MySQL時一般以ISO-8859字符集作為默認(rèn)的字符集,因此在比較過程中中文編碼字符大小寫轉(zhuǎn)換造成了這種現(xiàn)象,一種解決方法是對于包含中文的字段加上"binary"屬性,使之作為二進(jìn)制比較
    2011-11-11
  • MySQL中字段類型char、varchar和text的區(qū)別

    MySQL中字段類型char、varchar和text的區(qū)別

    今天小編就為大家分享一篇關(guān)于MySQL中字段類型char、varchar和text的區(qū)別,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • mysql錯誤代碼error2003的問題及解決

    mysql錯誤代碼error2003的問題及解決

    這篇文章主要介紹了mysql錯誤代碼error2003的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Windows環(huán)境下的MYSQL5.7配置文件定位圖文分析

    Windows環(huán)境下的MYSQL5.7配置文件定位圖文分析

    本文通過圖文并茂的形式給大家介紹了Windows環(huán)境下的MYSQL5.7配置文件定位 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • MySQL創(chuàng)建索引需要了解的

    MySQL創(chuàng)建索引需要了解的

    這篇文章主要介紹了MySQL創(chuàng)建索引需要了解的知識,幫助大家更正確的使用MySQL的索引,感興趣的朋友可以了解下
    2021-04-04
  • MySQL存儲數(shù)據(jù)亂碼的問題解析

    MySQL存儲數(shù)據(jù)亂碼的問題解析

    這篇文章主要介紹了MySQL存儲數(shù)據(jù)亂碼的問題解析,作者從實(shí)際使用中的多個方面定位其原因然后解決,需要的朋友可以參考下
    2015-05-05
  • mysqldump你可能不知道的參數(shù)

    mysqldump你可能不知道的參數(shù)

    這篇文章主要介紹了mysqldump你可能不知道的參數(shù),幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-11-11
  • 詳解如何在阿里云上安裝mysql

    詳解如何在阿里云上安裝mysql

    mysql作為輕量級開源數(shù)據(jù)庫,在企業(yè)級的應(yīng)用中非常的廣泛。這篇文章主要介紹了詳解如何在阿里云上安裝mysql,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • MySQL如何修改字段類型和字段長度

    MySQL如何修改字段類型和字段長度

    這篇文章主要介紹了MySQL如何修改字段類型和字段長度,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論