mysql 聯表查詢 100w 資料優化

2021-08-20 06:24:42 字數 2335 閱讀 3392

閒來無事,使用vue封裝了個table元件,封裝完成後想測試下,資料量小的情況下,能迅速展現資料,資料上了100w後,直接超時,結果一步步排查,發現是sql查詢的問題

使用表:訂單表 order (100w+),商品表goods  , 使用者表 user 

未優化前sql查詢語句:

select o.order_id, u.username,g.title,g. status,g.id as gid,g.price,o.goods_num,(g.price * o.goods_num) as totalprice,o.w_time,u.phone,u.id as uids,u.role,o.id from self_order o inner join `self_user` `u` on `u`.`uid` = `o`.`uid` inner join `self_goods` `g` on `g`.`id` = `o`.`goods_id` order by `o`.`order_id` desc, `o`.`w_time` desc limit 0, 15;
效果如下:

查詢這15條資料竟然達到了12.2s

1、首先我先對主表進行查詢,判斷是不是連表的問題

select * from self_order order by order_id desc, w_time desc limit 0, 15
執行語句發現用時1.258s,說明真是在連表這裡有問題

2、使用explain進行檢視sql語句(這篇文章對explain裡的引數進行了詳細講解:mysql中explain用法和結果的含義)

發現這裡的型別為ref,效率並不是很高,就想能不能達到eq_ref或者const這種效果呢?

首先想到使用in 子查詢,sql語句如下

select o.order_id, u.username,g.title,g. status,g.id as gid,g.price,o.goods_num,(g.price * o.goods_num) as totalprice,o.w_time,u.phone,u.id as uids,u.role,o.id from self_order o inner join `self_user` `u` on `u`.`uid` = `o`.`uid` inner join `self_goods` `g` on `g`.`id` = `o`.`goods_id` where `o`.`id` in (select id from `self_order` order by `o`.`order_id` desc, `o`.`w_time` desc limit 0, 15);
執行該語句,mysql報錯了3、又在網上查了一些資料,發現可以使用連表來進行優化

優化後的sql語句:

select o.order_id,u.username,g.title,g. status,g.id as gid,g.price,o.goods_num,(g.price * o.goods_num) as totalprice,o.w_time,u.phone,u.id as uids,u.role,o.id from self_order o inner join (select id from self_order order by `order_id` desc,`w_time` desc limit 0,15) as so on so.id = o.id inner join `self_user` `u` on `u`.`uid` = `o`.`uid` inner join `self_goods` `g` on `g`.`id` = `o`.`goods_id`;
我回頭想了下,之前查詢12s主要是因為查詢主表100w+資料後在將這100+資料分別和self_user和self_goods進行連表查詢,而優化的之後的sql語句是將15條資料和self_user和self_goods表裡的資料進行連線,自然速度要快很多。所以,sql查詢的時候一定要有where語句,並將where語句裡的字段增家索引。

SQL查詢效率 100w資料查詢只要1秒

sql查詢效率 100w資料查詢只要1秒 關於sql查詢效率,100w資料,查詢只要1秒,與您分享 機器情況 p4 2.4 記憶體 1 g os windows 2003 資料庫 ms sql server 2000 目的 查詢效能測試,比較兩種查詢的效能 sql查詢效率 step by step ...

SQL查詢效率 100w資料查詢只要1秒

機器情況 p4 2.4 記憶體 1 g os windows 2003 資料庫 ms sql server 2000 目的 查詢效能測試,比較兩種查詢的效能 sql查詢效率 step by step setp 1.建表 create table t userinfo userid intidenti...

SQL查詢效率 100w資料查詢只要1秒

關於sql查詢效率,100w資料,查詢只要1秒,與您分享 機器情況 p4 2.4 記憶體 1 g os windows 2003 資料庫 ms sql server 2000 目的 查詢效能測試,比較兩種查詢的效能 sql查詢效率 step by step setp 1.建表 create tabl...