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

歡迎訪問 生活随笔!

生活随笔

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

数据库

mysql 语句优化实例_MySQL 语句优化实例

發布時間:2024/10/5 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 语句优化实例_MySQL 语句优化实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

優化 LIMIT 分頁

-- 執行耗時:1.379s

SELECT * from vio_basic_domain_info LIMIT 1000000,10;

處理分頁慢查詢的方式一般有以下幾種:

思路一:構造覆蓋索引

通過修改 SQL,使用上覆蓋索引,比如我需要只查詢表中的 app_name、createTime 等少量字段,那么我只需在 app_name、createTime 字段設置聯合索引,即可實現覆蓋索引,無需全表掃描。

適用于查詢列較少的場景,查詢列數過多的不推薦,耗時:0.390s。

SELECT app_name,createTime from vio_basic_domain_info LIMIT 1000000,10;

思路二:優化 offset

無法用上覆蓋索引,那么重點是想辦法快速過濾掉前 100w 條數據。我們可以利用自增主鍵有序的條件,先查詢出第 1000001 條數據的 id 值,再往后查 10 行。

原理:先基于索引查詢出第 1000001 條數據對應的主鍵 id 的值,然后直接通過該 id 的值直接查詢該 id 后面的 10 條數據。

適用于主鍵 id 自增的場景,耗時:0.471s。

SELECT * from vio_basic_domain_info where id >=(SELECT id from vio_basic_domain_info ORDER BY id limit 1000000,1) limit 10;

方法三:“延遲關聯”

耗時:0.439s,延遲關聯適用于數量級較大的表。

這里我們利用到了覆蓋索引+延遲關聯查詢,相當于先只查詢 id 列,利用覆蓋索引快速查到該頁的 10 條數據 id,然后再把返回的 10 條 id 拿到表中通過主鍵索引二次查詢。(表數據增速快的情況對該方法影響較小)

SELECT * from vio_basic_domain_info inner join (select id from vio_basic_domain_info order by id limit 1000000,10) as myNew using(id);

排查索引沒起作用的情況

模糊查詢盡量避免用通配符'%'開頭,會導致數據庫引擎放棄索引進行全表掃描

-- 不走索引

SELECT * FROM t WHERE username LIKE '%陳%'

-- 走索引

SELECT * FROM t WHERE username LIKE '陳%'

盡量避免使用 not in,會導致引擎走全表掃描。建議用 not exists 代替

-- 不走索引

SELECT * FROM t WHERE name not IN ('提莫','隊長');

-- 走索引

select * from t as t1 where not exists (select * from t as t2 where name IN ('提莫','隊長') and t1.id = t2.id);

盡量避免使用 or,會導致數據庫引擎放棄索引進行全表掃描

SELECT * FROM t WHERE id = 1 OR id = 3

-- 優化方式:可以用 union 代替 or。如下:

SELECT * FROM t WHERE id = 1

UNION

SELECT * FROM t WHERE id = 3

盡量避免進行 null 值的判斷,會導致數據庫引擎放棄索引進行全表掃描

SELECT * FROM t WHERE score IS NULL

-- 優化方式:可以給字段添加默認值 0,對 0 值進行判斷。如下:

SELECT * FROM t WHERE score = 0

盡量避免在 where 條件中等號的左側進行表達式、函數操作,會導致數據庫引擎放棄索引進行全表掃描

可以將表達式、函數操作移動到等號右側。如下:

-- 全表掃描

SELECT * FROM T WHERE score/10 = 9

-- 走索引

SELECT * FROM T WHERE score = 10*9

當數據量大時,避免使用 where 1=1 的條件。通常為了方便拼裝查詢條件,我們會默認使用該條件,數據庫引擎會放棄索引進行全表掃描

SELECT username, age, sex FROM T WHERE 1=1

-- 優化方式:用代碼拼裝 SQL 時進行判斷,沒 where 條件就去掉 where,有 where 條件就加 and。

查詢條件不能用 <> 或者 !=

使用索引列作為條件進行查詢時,需要避免使用<>或者!=等判斷條件。

如確實業務需要,使用到不等于符號,需要在重新評估索引建立,避免在此字段上建立索引,改由查詢條件中其他索引字段代替

where 條件僅包含復合索引非前導列

如:復合(聯合)索引包含 key_part1,key_part2,key_part3 三列,但 SQL 語句沒有包含索引前置列"key_part1",按照 MySQL 聯合索引的最左匹配原則,不會走聯合索引。

-- 不走索引

select col1 from table where key_part2=1 and key_part3=2

-- 走索引

select col1 from table where key_part1 =1 and key_part2=1 and key_part3=2

隱式類型轉換造成不使用索引

如下 SQL 語句由于索引對列類型為 varchar,但給定的值為數值,涉及隱式類型轉換,造成不能正確走索引。

select col1 from table where col_varchar=123;

總結

以上是生活随笔為你收集整理的mysql 语句优化实例_MySQL 语句优化实例的全部內容,希望文章能夠幫你解決所遇到的問題。

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