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

Mysql中between...and引起的索引失效問(wèn)題及解決

 更新時(shí)間:2023年07月28日 10:27:35   作者:等待中的小碼農(nóng)  
這篇文章主要介紹了Mysql中between...and引起的索引失效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

發(fā)生場(chǎng)景

在查詢學(xué)生表的時(shí)候,需要支持根據(jù)創(chuàng)建時(shí)間來(lái)篩選出某段時(shí)間內(nèi)入學(xué)的學(xué)生總數(shù),因此在創(chuàng)建時(shí)間上加了索引,但是最終發(fā)現(xiàn)還是會(huì)走全量查詢。

實(shí)驗(yàn)過(guò)程

CREATE TABLE `t_user` (
  `id` bigint(11) unsigned NOT NULL COMMENT '學(xué)生id',
  `name` varchar(24) NOT NULL COMMENT '學(xué)生名稱',
  `createTime` dat NOT NULL COMMENT '創(chuàng)建時(shí)間',
  PRIMARY KEY (`id`),
  KEY `index_updateTime` (`createTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
select count(1) from t_user where createTime between '2022-08-30' and '2022-08-31';

使用insert語(yǔ)句插入3萬(wàn)多條數(shù)據(jù)后,其中30號(hào)至31號(hào)之前有9千多條數(shù)據(jù),發(fā)現(xiàn)查詢的時(shí)候并沒(méi)有走到索引。

結(jié)果如下:

在這里插入圖片描述

縮小查詢區(qū)間,只查31號(hào)的(4千多條數(shù)據(jù)),卻發(fā)現(xiàn)可以走到索引了,

結(jié)果如下:

select count(1) from t_user where createTime between '2022-08-31' and '2022-08-31';

在這里插入圖片描述

再找一個(gè)數(shù)據(jù)量為5千的區(qū)間來(lái)試一下,也是會(huì)走到索引的,

結(jié)果如下:

select count(1) from t_user where createTime between '2022-08-23' and '2022-08-25';

在這里插入圖片描述

沒(méi)走到索引是因?yàn)閎etween…and引起的嗎?如果改為>=和<=呢。

結(jié)果如下:

select count(1) from t_user where createTime >= '2022-08-30' and createTime  <= '2022-08-31';

在這里插入圖片描述

結(jié)論

經(jīng)過(guò)實(shí)驗(yàn)發(fā)現(xiàn),當(dāng)查詢的數(shù)據(jù)量達(dá)到6千(占比20%左右),就不走索引了。

引起原因:

表的數(shù)據(jù)量太大,會(huì)讓數(shù)據(jù)庫(kù)中的優(yōu)化器進(jìn)行處理。

優(yōu)化器是在表里面有多個(gè)索引的時(shí)候,決定使用哪個(gè)索引,查詢的量太大,導(dǎo)致優(yōu)化器認(rèn)為走全表查詢時(shí)間效率更佳。

但是如果一定要用到區(qū)間查詢,這個(gè)問(wèn)題該如何解決呢?

方案一

select count(1) from t_user where createTime between '2022-08-30' and '2022-08-31' limit 1;

在這里插入圖片描述

方案二

select count(1) from t_user FORCE INDEX(index_updateTime) where createTime between '2022-08-30' and '2022-08-31';

在這里插入圖片描述

思考:

當(dāng)查詢數(shù)據(jù)量達(dá)到一定量的時(shí)候會(huì)導(dǎo)致between…and索引失效,那分頁(yè)查詢的時(shí)候呢?

select id,name, createTime from t_user where createTime between '2022-08-30' and '2022-08-31' limit 1,500;

在這里插入圖片描述

可見(jiàn),查詢第一頁(yè)的時(shí)候索引有效,但是隨著頁(yè)碼越來(lái)越大的時(shí)候,索引卻失效了,

select id,name, createTime from t_user where createTime between '2022-08-30' and '2022-08-31' limit 100000,500;

在這里插入圖片描述

因此,遇到這種因查詢數(shù)據(jù)量過(guò)大而導(dǎo)致的索引失效的問(wèn)題,需要對(duì)其功能做相應(yīng)限制處理。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論