日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL创建索引跳过redo_明明我建了索引,为什么sql执行的还是这么慢?

發布時間:2024/9/30 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL创建索引跳过redo_明明我建了索引,为什么sql执行的还是这么慢? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原標題:明明我建了索引,為什么sql執行的還是這么慢?

很多同學經常遇到這樣一個問題,就是為了避免sql 執行緩慢,提前將各種可能用到的字段都添加上索引,查詢的時候盡可能的使用這些字段,避免全表掃描。可是,明明我已經添加了索引,問什么還是這么慢呢?

一條 SQL 語句執行的很慢,那是每次執行都很慢呢?還是大多數情況下是正常的,偶爾出現很慢呢?所以我覺得,我們還得分以下兩種情況來討論。

大多數情況是正常的,只是偶爾會出現很慢的情況。

在數據量不變的情況下,這條SQL語句一直以來都執行的很慢。

針對這兩種情況,我們來分析下可能是哪些原因導致的。

一、針對偶爾很慢的情況

一條 SQL 大多數情況正常,偶爾才能出現很慢的情況,針對這種情況,我覺得這條SQL語句的書寫本身是沒什么問題的,而是其他原因導致的,那會是什么原因呢?

1、數據庫在刷新臟頁

當我們要往數據庫插入一條數據、或者要更新一條數據的時候,我們知道數據庫會在內存中把對應字段的數據更新了,但是更新之后,這些更新的字段并不會馬上同步持久化到磁盤中去,而是把這些更新的記錄寫入到 redo log 日記中去,等到空閑的時候,在通過 redo log 里的日記把最新的數據同步到磁盤中去。數據庫在在同步數據到磁盤的時候,就有可能導致我們的SQL語句執行的很慢了。

2、拿不到鎖

這個就比較容易想到了,我們要執行的這條語句,剛好這條語句涉及到的表,別人在用,并且加鎖了,我們拿不到鎖,只能慢慢等待別人釋放鎖了。或者,表沒有加鎖,但要使用到的某個一行被加鎖了,這個時候,我也沒辦法啊。

下來我們來訪分析下第二種情況,我覺得第二種情況的分析才是最重要的。

二、針對一直都這么慢的情況

我們先來假設我們有一個表,表里有下面兩個字段,分別是主鍵 id,和兩個普通字段 c 和 d。并建立相關索引。

mysql> CREATE TABLE `t` (

`id` int(11) NOT ,

`c` int(11) DEFAULT ,

`d` int(11) DEFAULT ,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;

1、沒用到索引

沒有用上索引,我覺得這個原因是很多人都能想到的,例如你要查詢這條語句:

select * from t where 100

1)字段有索引,但卻沒有用索引

好吧,這個時候你給 c 這個字段加上了索引,然后又查詢了一條語句:

select * from t where c - 1 = 1000;

3)函數操作導致沒有用上索引

如果我們在查詢的時候,對字段進行了函數操作,也是會導致沒有用上索引的,例如:

select * from t where pow(c,2) = 1000;

2、數據庫自己選錯索引

我們在進行查詢操作的時候,例如:

select * from t where 100 < c and c < 100000;

就算你在 c 字段上有索引,系統也并不一定會走 c 這個字段上的索引,而是有可能會直接掃描掃描全表,找出所有符合 100 < c and c < 100000 的數據。

為什么會這樣呢?系統是有可能走全表掃描而不走索引的。

那系統是怎么判斷呢?

判斷來源于系統的預測,也就是說,如果要走 c 字段索引的話,系統會預測走 c 字段索引大概需要掃描多少行。如果預測到要掃描的行數很多,它可能就不走索引而直接掃描全表了。

那么問題來了,系統是怎么預測判斷的呢?這里我給你講下系統是怎么判斷的吧,雖然這個時候我已經寫到脖子有點酸了。

系統是通過索引的區分度來判斷的,一個索引上不同的值越多,意味著出現相同數值的索引越少,意味著索引的區分度越高。我們也把區分度稱之為基數,即區分度越高,基數越大。所以呢,基數越大,意味著符合 100 < c and c < 10000 這個條件的行數越少。

所以呢,一個索引的基數越大,意味著走索引查詢越有優勢。

三、總結

建了索引,并且使用了索引字段,并不代表著查詢一定走索引。sql 執行緩慢存在多種可能,具體問題具體分析吧。添加索引,慎用函數,根據規則避免走全表掃描。優化是一個過程,需要慢慢琢磨。

ps:看更多干貨,加入技術交流微信群可以關注我的公眾號360linker返回搜狐,查看更多

責任編輯:

總結

以上是生活随笔為你收集整理的MySQL创建索引跳过redo_明明我建了索引,为什么sql执行的还是这么慢?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。