最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql不走索引的幾個(gè)問題小結(jié)

 更新時(shí)間:2023年08月14日 10:49:29   作者:風(fēng)破冬  
MySQL中不走索引的問題通常發(fā)生在查詢中使用了函數(shù),這會使索引失效,從而影響查詢性能,本文就介紹了mysql不走索引的幾個(gè)問題小結(jié),感興趣的可以了解一下

一、類型不匹配導(dǎo)致不走索引

這類問題往往是因?yàn)閿?shù)據(jù)定義與使用上面的偏差,比如工號,定義成varchar,然而用的時(shí)候又不講工號打上引號

創(chuàng)建表代碼舉例如下:

----創(chuàng)建表:
CREATE TABLE `test_a`(
    `id` int(11) NOT NULL,
    `work_no` varchar(11) DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `index_work_no`(`work_no`)
)ENGINE=InnoDB;

查詢條件對比如下:

----查詢工號,執(zhí)行一下-----
explain SELECT * from test_a where work_no=1000;
explain  SELECT * from test_a where work_no="1000";

結(jié)論,可以自己運(yùn)行一下代碼,會發(fā)現(xiàn)上面的因?yàn)槎x成了varchar,但是用的時(shí)候又在把它當(dāng)int用,沒有加引號,導(dǎo)致無法走索引

二、索引用錯(cuò)的問題

這個(gè)是索引用錯(cuò)的問題,創(chuàng)建表及初始化數(shù)據(jù)代碼如下:

----創(chuàng)建表:
CREATE TABLE `test_t`(
    `id` int(11) NOT NULL,
    `a` int(11) DEFAULT NULL,
    `b` int(11) DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `index_a`(`a`),
    KEY`index_b`(`b`)
)ENGINE=InnoDB;
-----定義初始化10w數(shù)據(jù)函數(shù):
delimiter;;
create procedure idata()
begin
    declare i int;
    set i=1;
    while(i<=100000) do
    insert into test_t values(i,i,i);
    set i=i+1;
    end while;
end;;
delimiter;
call idata();
----刪除存儲過程
drop procedure idata;

相關(guān)查詢對比:

----查詢條件
explain select * from test_t where (a BETWEEN 1 and 1000) and (b BETWEEN 50000 and 100000) order by b limit 1;
explain select * from test_t force index(index_a) where (a BETWEEN 1 and 1000) and (b BETWEEN 50000 and 100000) order by b limit 1;

結(jié)論,最終出現(xiàn)第一個(gè)走錯(cuò)了索引,導(dǎo)致查詢時(shí)候會變長的問題。

而下面的我們加強(qiáng)制走索引,會發(fā)現(xiàn)執(zhí)行掃描行數(shù)要少很多,主要原因還是發(fā)生在order上

如果做下面的修改不強(qiáng)制走索引也能夠走正確的索引就是order by b, a。同時(shí)放上去也是有效的

三、條件字段為函數(shù)的操作導(dǎo)致不走索引

函數(shù)作用在索引字段上導(dǎo)致不走索引,其實(shí)感覺mysql盡量少用函數(shù),雖然提供了,往往還是占用的mysql自己的資源做的計(jì)算。mysql數(shù)據(jù)庫的資源多貴呀,物理機(jī)多便宜呀

----創(chuàng)建表:
CREATE TABLE `trade_log`(
    `id` int(11) NOT NULL,
    `created_time` datetime NOT NULL DEFAULT,
    `b` int(11) DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `index_created_time`(`created_time`)
)ENGINE=InnoDB;
-----定義初始化10w數(shù)據(jù)函數(shù):
delimiter;;
create procedure c_trade_log()
begin
    declare i int;
    set i=1;
    while(i<=100000) do
    insert into trade_log values(i,from_unixtime(1539123415 + 1000*i),i);
    set i=i+1;
    end while;
end;;
delimiter;
call c_trade_log();
----刪除存儲過程
DROP PROCEDURE c_trade_log

查詢條件:

explain SELECT count(*) from trade_log where month(created_time)=7;
SELECT count(*) from trade_log where month(created_time)=7;
-----優(yōu)化-----
explain SELECT count(*) from trade_log where created_time BETWEEN "2018-07-01" and "2018-08-01"
or created_time BETWEEN "2019-07-01" and "2019-08-01"
or created_time BETWEEN "2020-07-01" and "2020-08-01"
or created_time BETWEEN "2021-07-01" and "2021-08-01" ;

四、錯(cuò)誤計(jì)算不走索引

查詢條件:繼續(xù)沿用上面的trade_log表

索引字段做減法在等號前,與等號后的區(qū)別

--不走索引
explain SELECT * from trade_log where id -1000=3030300
--走索引
explain SELECT * from trade_log where id =3030300-1000
 

五、in后面的公式

繼續(xù)使用test_t表

--不走索引 因?yàn)橛衜ax,不要究竟這兒為什么要加max公式,主要是為了突出這兒不走索引給的一個(gè)例子
explain select * FROM test_t WHERE id IN
( SELECT max(id) FROM test_t WHERE a BETWEEN 1000 and 2000 GROUP BY a )
--走索引
explain select * FROM test_t WHERE id IN
( SELECT id FROM test_t WHERE a BETWEEN 1000 and 2000 GROUP BY a )

不走索引的結(jié)果:

走索引的結(jié)果: 

其他:慢sql相關(guān)配置開啟命令

----慢查詢開啟情況---
show variables like "slow_query_log";
----設(shè)置開啟----
set global slow_query_log = "ON";
---慢查詢?nèi)罩镜刂?--
show variables like "slow_query_log_file";

到此這篇關(guān)于mysql不走索引的幾個(gè)問題小結(jié)的文章就介紹到這了,更多相關(guān)mysql不走索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql常見問題解決

    mysql常見問題解決

    網(wǎng)上看到了不錯(cuò)的mysql下常見錯(cuò)誤解決方法,特整理下,方便大家學(xué)習(xí)mysql
    2008-02-02
  • mybatis實(shí)戰(zhàn)之?dāng)r截器解讀

    mybatis實(shí)戰(zhàn)之?dāng)r截器解讀

    這篇文章主要介紹了mybatis實(shí)戰(zhàn)之?dāng)r截器解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Mysql中文亂碼問題的最佳解決方法

    Mysql中文亂碼問題的最佳解決方法

    這篇文章主要介紹了Mysql中文亂碼問題的最佳解決方法,需要的朋友可以參考下
    2014-07-07
  • MySQL錯(cuò)誤代碼2058和2059的解決辦法

    MySQL錯(cuò)誤代碼2058和2059的解決辦法

    這篇文章主要介紹了MySQL錯(cuò)誤代碼2058和2059的解決辦法,2058和2059的錯(cuò)誤碼核心都是你用的客戶端工具和mysql版本的密碼插件不匹配,下面就來介紹一下解決方法,感興趣的可以了解一下
    2025-03-03
  • MySQL如何快速的創(chuàng)建千萬級測試數(shù)據(jù)

    MySQL如何快速的創(chuàng)建千萬級測試數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于MySQL如何快速的創(chuàng)建千萬級測試數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • centos7中如何利用crontab進(jìn)行mysql定時(shí)備份

    centos7中如何利用crontab進(jìn)行mysql定時(shí)備份

    crontab是一個(gè)命令,常見于Unix和類Unix的操作系統(tǒng)之中,用于設(shè)置周期性被執(zhí)行的指令,下面這篇文章主要給大家介紹了關(guān)于centos7中如何利用crontab進(jìn)行mysql定時(shí)備份的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • MySQL中的臨時(shí)表與內(nèi)存表

    MySQL中的臨時(shí)表與內(nèi)存表

    這篇文章主要介紹了MySQL中的臨時(shí)表與內(nèi)存表,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 如何優(yōu)雅、安全的關(guān)閉MySQL進(jìn)程

    如何優(yōu)雅、安全的關(guān)閉MySQL進(jìn)程

    這篇文章主要介紹了如何優(yōu)雅、安全的關(guān)閉MySQL進(jìn)程,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下
    2020-08-08
  • MAC下修改mysql默認(rèn)字符集為utf8的方法

    MAC下修改mysql默認(rèn)字符集為utf8的方法

    本文主要介紹了如何修改MAC版mysql默認(rèn)字符集為utf8,如果你的MAC版mysql字符亂碼,可以參考一下這篇文章
    2018-03-03
  • SQL實(shí)戰(zhàn)演練之網(wǎng)上商城數(shù)據(jù)庫商品類別數(shù)據(jù)操作

    SQL實(shí)戰(zhàn)演練之網(wǎng)上商城數(shù)據(jù)庫商品類別數(shù)據(jù)操作

    一直認(rèn)為,扎實(shí)的SQL功底是一名數(shù)據(jù)分析師的安身立命之本,甚至可以稱得上是所有數(shù)據(jù)從業(yè)者的基本功。當(dāng)然,這里的SQL絕不單單是寫幾條查詢語句那么簡單,接下來請跟著小編通過案例項(xiàng)目演練一遍商品類別的數(shù)據(jù)操作吧
    2021-10-10

最新評論

桐庐县| 铁岭县| 伊宁市| 宝丰县| 都匀市| 灵川县| 韶山市| 巢湖市| 连江县| 康乐县| 克山县| 灵台县| 子洲县| 萝北县| 武穴市| 沈阳市| 巴楚县| 牙克石市| 崇州市| 偏关县| 资溪县| 中宁县| 娱乐| 阿克陶县| 岱山县| 育儿| 化德县| 日土县| 台江县| 黄浦区| 新巴尔虎左旗| 房产| 琼中| 南和县| 邹平县| 遂宁市| 雅安市| 屯留县| 庆元县| 辽阳县| 房产|