亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL?in太多過慢的三種解決方案

 更新時間:2024年05月20日 08:53:01   作者:大悠  
在MySQL中有一個配置參數(shù)eq_range_index_dive_limit,它的作用是一個等值查詢(比如:in?查詢),使用掃描索引樹的方式分析在MySQL內(nèi)部叫做index dives,使用索引統(tǒng)計的方式分析在MySQL內(nèi)部叫做index statistics,本文給大家介紹了MySQL?in太多過慢的三種解決方案

MySQL in 太多出現(xiàn)慢的原因

在MySQL中有一個配置參數(shù)eq_range_index_dive_limit,它的作用是一個等值查詢(比如:in 查詢),其等值條件數(shù)小于該配置參數(shù),則查詢成本分析使用掃描索引樹的方式分析,如果大于等于該配置參數(shù),則使用索引統(tǒng)計的方式分析。使用掃描索引樹的方式分析在MySQL內(nèi)部叫做index dives,使用索引統(tǒng)計的方式分析在MySQL內(nèi)部叫做index statistics。

eq_range_index_dive_limit 默認(rèn)值是 200 .

select * from dogs where id in (1, 2, 3, 4);

結(jié)合上面這條 SQL,就是如果 SQL 中 IN 查詢字段 id 的值出現(xiàn)的數(shù)量小于 eq_range_index_dive_limit,則走索引樹掃描分析查詢成本,大于等于 eq_range_index_dive_limit,則走索引統(tǒng)計的方式分析查詢成本。

掃描索引樹的方式分析 SQL 的查詢成本,它的好處就是在 IN 查詢的值數(shù)量不多時,得到的成本結(jié)果是精確的,這就意味著 MySQL 可以選擇正確的執(zhí)行計劃,保證語句查詢的性能。你現(xiàn)在一定有個疑問:為什么說是在 IN 查詢的值數(shù)量不多時才是精確的,因為掃描性能的原因,MySQL 在 IN 查詢的值數(shù)量很多的情況下,掃描索引樹成本提高,性能下降,導(dǎo)致查詢成本分析代價也隨之提高了。

索引統(tǒng)計的方式分析 SQL 的查詢成本,由于無需掃描索引樹,所以,它的優(yōu)勢就是查詢成本分析過程快,代價低。但是,它的缺點也很明顯,由于無需掃描索引樹,通過粗略統(tǒng)計索引使用情況,得出查詢成本,導(dǎo)致 MySQL 可能選錯執(zhí)行計劃,使得 SQL 查詢性能下降。

解決方案

方案一

可以通過拆分 in 的數(shù)量, 分批查詢.

select * from dogs where id in (1, 2);
select * from dogs where id in (3, 4);

這種方法缺點也明顯, 對于分頁或者是查詢總條件的一部分并不能實現(xiàn).

方案二

使用 union all 實現(xiàn)內(nèi)存級別臨時表.

select *
from users where task_created > '2020-01-01' and  task_tag_id in ('-1', '1' , ....'1000個');

結(jié)果: 在 1 s 631 ms (execution: 172 ms, fetching: 1 s 459 ms) 內(nèi)檢索到從 1 開始的 500 行

select * from users u
    inner join (select -99 as id union all select '1' union all select '-1'
union all select '1' ) as temp on u.task_tag_id = temp.id
where task_created > '2020-01-01'

結(jié)果: 在 383 ms (execution: 201 ms, fetching: 182 ms) 內(nèi)檢索到從 1 開始的 500 行

方案三

使用 實體表

創(chuàng)建實體表

create table jump_data
(
    id          bigint auto_increment
        primary key,
    user_id      bigint   default -1                not null comment '人員id',
    hash        varchar(70)          not null comment '當(dāng)前存儲關(guān)聯(lián) hash 值',
    ref         varchar(100)                comment '關(guān)聯(lián)數(shù)據(jù) id',
    ref_long    bigint                             null,
    create_time datetime default CURRENT_TIMESTAMP null comment '創(chuàng)建時間',
    index idx_hash_ref(hash, ref),
    index idx_hash_ref_long(hash, ref)
);
  • 將上面 task_tag_id 插入至 臨時表

    可使用 insert values 插入

  • 如果是結(jié)果值可以直接使用

    insert select 插入

使用

select *
from users u  inner join jump_data jd on u.hash = '' and u.ref_long = u.id
where task_created > '2020-01-01'

注意點

  • 需要及時清理 jump_data 表
  • 定時需要 truncate 表因為反復(fù)的新增和刪除導(dǎo)致 MySQL 預(yù)估數(shù)據(jù)不準(zhǔn)確導(dǎo)致速度下降

以上就是MySQL in太多過慢的三種解決方案的詳細內(nèi)容,更多關(guān)于MySQL in太多過慢的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL多表關(guān)聯(lián)on和where速度對比實測看誰更快

    MySQL多表關(guān)聯(lián)on和where速度對比實測看誰更快

    這篇文章主要介紹了MySQL多表關(guān)聯(lián)on和where速度對比實測看誰更快問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Mysql 實現(xiàn)向上遞歸查找父節(jié)點并返回樹結(jié)構(gòu)的示例代碼

    Mysql 實現(xiàn)向上遞歸查找父節(jié)點并返回樹結(jié)構(gòu)的示例代碼

    通過mysql 8.0以下版本實現(xiàn),一個人多角色id,一個角色對應(yīng)某個節(jié)點menu_id,根節(jié)點的父節(jié)點存儲為NULL, 向上遞歸查找父節(jié)點并返回樹結(jié)構(gòu),今天通過本文給大家介紹Mysql遞歸查找父節(jié)點并返回樹結(jié)構(gòu),感興趣的朋友一起看看吧
    2022-09-09
  • Mysql 直接查詢存儲的Json字符串中的數(shù)據(jù)

    Mysql 直接查詢存儲的Json字符串中的數(shù)據(jù)

    本文主要介紹了Mysql直接查詢存儲的Json字符串中的數(shù)據(jù),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • MySQL數(shù)據(jù)庫約束操作示例講解

    MySQL數(shù)據(jù)庫約束操作示例講解

    約束是用來限制表中的數(shù)據(jù)長什么樣子的,即什么樣的數(shù)據(jù)可以插入到表中,什么樣的數(shù)據(jù)插入不到表中,下面這篇文章主要給大家介紹了關(guān)于如何通過一文理解MySQL數(shù)據(jù)庫的約束與表的設(shè)計的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Mysql中g(shù)roup by 使用中發(fā)現(xiàn)的問題

    Mysql中g(shù)roup by 使用中發(fā)現(xiàn)的問題

    當(dāng)使用MySQL的GROUP BY語句時,根據(jù)指定的列對結(jié)果進行分組,這種情況通常是由于在 GROUP BY 中選擇的字段與其他非聚合字段不兼容,或者在 SELECT 子句中沒有正確使用聚合函數(shù)所導(dǎo)致的,本文給大家介紹Mysql中g(shù)roup by 使用中發(fā)現(xiàn)的問題,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Mysql中存儲UUID去除橫線的方法

    Mysql中存儲UUID去除橫線的方法

    這篇文章主要介紹了Mysql中存儲UUID去除橫線的方法,本文給出了3個Mysql函數(shù)實現(xiàn)去除去UUID中的橫線,需要的朋友可以參考下
    2015-02-02
  • MySQL存儲表情符號小技巧

    MySQL存儲表情符號小技巧

    這篇文章主要為大家介紹了MySQL如何存儲表情符號的小技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • MySQL單表記錄數(shù)過大的優(yōu)化方法

    MySQL單表記錄數(shù)過大的優(yōu)化方法

    當(dāng)MySQL單表記錄數(shù)過大時,采取合理的優(yōu)化策略是保障系統(tǒng)高性能的關(guān)鍵,本博客詳細介紹了索引優(yōu)化、分區(qū)表、垂直拆分、水平拆分等多種優(yōu)化手段,并提供了詳細的代碼示例,感興趣的朋友一起看看吧
    2024-01-01
  • dubbo中zookeeper請求超時問題:mybatis+spring連接mysql8.0.15的配置

    dubbo中zookeeper請求超時問題:mybatis+spring連接mysql8.0.15的配置

    這篇文章主要介紹了dubbo中zookeeper請求超時問題:mybatis+spring連接mysql8.0.15的配置,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Mysql和文件系統(tǒng)的關(guān)聯(lián)詳情

    Mysql和文件系統(tǒng)的關(guān)聯(lián)詳情

    這篇文章主要介紹了Mysql和文件系統(tǒng)的關(guān)聯(lián)詳情,Mysql常用的存儲引擎如InnoDB、MyISAM采用的是文件存儲,自然和文件系統(tǒng)掛鉤,那么Mysql都有哪些地方用到了文件系統(tǒng)呢,下面我們一起進入文章學(xué)習(xí)詳細內(nèi)容吧
    2022-09-09

最新評論