首頁 > 軟體

MySQL詳解如何優化查詢條件

2022-05-21 13:02:09

前言

技術能解決的事情改技術

技術解決不了的事情該需求

現狀

假設我們目前有兩張表

業務表 書( t_a_book ) 閱讀歷史記錄表 (t_r_book_history) 使用者表

其兩張表的資料邏輯如下

t_a_book

t_r_book_history

t_a_user

當然了,我們假設當前的資料量並不只是我們眼前看到的這幾條資料,而是線上真實情況。

每張表至少都是10w+起步

問題一

這時候,我們需要面臨第一個業務問題,

我們需要做一個報表,顯示使用者閱讀圖書的記錄,並顯示使用者名稱,使用者號,書名

這時候我們如何設計查詢SQL

多表聯查

SELECT * FROM t_r_book_history bh 
	LEFT JOIN t_a_user u ON bh.user_id = u.id 
	LEFT JOIN t_a_book b ON bh.book_id = b.id 
WHERE 
	bh.record_flag = 1 
ORDER BY bh.release_time DESC LIMIT 10;

查詢出來的結果為

其邏輯為

  • 資料庫根據release_time倒序查詢資料表,取出倒序的資料
  • 根據左連線獲取 使用者資訊
  • 根據左連線獲取 圖書資訊

單表查詢

如果此時我們選擇化繁為簡,使用單表的查詢方法,來查詢資料其SQL為

SELECT * FROM t_r_book_history bh 
WHERE 
	bh.record_flag = 1 
ORDER BY bh.release_time DESC LIMIT 10;
// 使用者資訊
SELECT * FROM t_a_user u WHERE u.id IN ();
// 圖書資訊
SELECT * FROM t_a_books b WHERE u.id IN ();

其資料邏輯與多表聯查一致,唯一不同的便是需要查詢三次

結論

我們可以看,當前兩種查詢方式的邏輯來看。

主要會存在的流量壓力在與 t_r_book_history 這張表上面

當資料量大的時候,我們只需要根據release_time 做索引,簡化這一步的操作。

後續都可以使用主鍵來簡化操作

由此來看,兩個語句其實在本質上沒有明顯的快慢之分

問題二

現在我們需要增加兩個查詢條件

  • 使用者名稱稱,支援模糊查詢
  • 書名資訊,支援模糊查詢

如果這時候,我們如何編寫SQL

多表聯查

如果我們使用多表聯查的思路來填寫SQL

SELECT * FROM t_r_book_history bh 
	LEFT JOIN t_a_user u ON bh.user_id = u.id 
	LEFT JOIN t_a_book b ON bh.book_id = b.id 
WHERE 
	bh.record_flag = 1 
	AND 
	b.name like "四%"
	and u.name like "張%"
ORDER BY bh.release_time DESC LIMIT 10;

顯示的資料

其邏輯為

  • 查詢使用者表,根據其使用者名稱稱進行模糊查詢
  • 查詢書表,根據書名進行模糊查詢
  • 根據使用者主鍵,書籍主鍵作為查詢條件來進行查詢

單表查詢

SELECT * FROM t_a_user WHERE user_name LIKE "張%"
SELECT * FROM t_a_book WHERE user_name LIKE "四%"
SELECT * FROM t_r_book_history bh 
WHERE 
	bh.record_flag = 1 
ORDER BY bh.release_time DESC LIMIT 10;
// 使用者資訊
SELECT * FROM t_a_user u WHERE u.id IN ();
// 圖書資訊
SELECT * FROM t_a_books b WHERE u.id IN ();

其查詢邏輯與多表聯查一致

問題

現在主要的問題在於 , t_a_user , t_a_book , t_r_book_history 這三張表都是大表,

我們使用的查詢條件也十分的模糊

簡單的說 , 無論我們使用哪種方法, 都有可能會出現幾十萬個符合的結果

因此,我們無論使用哪種編寫方法 , 這個SQL都是不可行的

如何解決

文章寫到這裡,我們會發現這個問題,已經不能停留再技術成面的問題。

因此,我們就只能修改需求

我們這裡的問題 , 是這兩張表的查詢條件。他十分的模糊,我們無法將範圍限制在幾條,幾十條,甚至幾百條內。

既然這樣,我們就只能跟需求方表示,這個查詢條件必須使用十分“明確”的資料

例如對於使用者,我們常常能用什麼來明確指向一個使用者呢?

id,資料主鍵,手機號碼

我們如何確定一本書呢?我們可以用一個ISBN

修改這兩個查詢條件,才能將這個不能解決的問題,修改為解決

但是,有人說,我們是技術。不能對產品提這樣的想法,

但是我想說,你是打算在將來來查詢卡半分鐘的時候說,說服所有人這個東西不關我的事

還是說,在未開發前說服產品

到此這篇關於MySQL詳解如何優化查詢條件的文章就介紹到這了,更多相關MySQL查詢條件內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com