MySQL詳解如何優(yōu)化查詢條件
前言
技術能解決的事情改技術
技術解決不了的事情該需求
現(xiàn)狀
假設我們目前有兩張表
業(yè)務表 書( t_a_book ) 閱讀歷史記錄表 (t_r_book_history) 用戶表
其兩張表的數據邏輯如下
t_a_book

t_r_book_history

t_a_user

當然了,我們假設當前的數據量并不只是我們眼前看到的這幾條數據,而是線上真實情況。
每張表至少都是10w+起步
問題一
這時候,我們需要面臨第一個業(yè)務問題,
我們需要做一個報表,顯示用戶閱讀圖書的記錄,并顯示用戶名,用戶號,書名
這時候我們如何設計查詢SQL
多表聯(lián)查
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 ();

其數據邏輯與多表聯(lián)查一致,唯一不同的便是需要查詢三次
結論
我們可以看,當前兩種查詢方式的邏輯來看。
主要會存在的流量壓力在與 t_r_book_history 這張表上面
當數據量大的時候,我們只需要根據release_time 做索引,簡化這一步的操作。
后續(xù)都可以使用主鍵來簡化操作
由此來看,兩個語句其實在本質上沒有明顯的快慢之分
問題二
現(xiàn)在我們需要增加兩個查詢條件
- 用戶名稱,支持模糊查詢
- 書名信息,支持模糊查詢
如果這時候,我們如何編寫SQL
多表聯(lián)查
如果我們使用多表聯(lián)查的思路來填寫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 ();
其查詢邏輯與多表聯(lián)查一致
問題
現(xiàn)在主要的問題在于 , t_a_user , t_a_book , t_r_book_history 這三張表都是大表,
我們使用的查詢條件也十分的模糊
簡單的說 , 無論我們使用哪種方法, 都有可能會出現(xiàn)幾十萬個符合的結果
因此,我們無論使用哪種編寫方法 , 這個SQL都是不可行的
如何解決
文章寫到這里,我們會發(fā)現(xiàn)這個問題,已經不能停留再技術成面的問題。
因此,我們就只能修改需求
我們這里的問題 , 是這兩張表的查詢條件。他十分的模糊,我們無法將范圍限制在幾條,幾十條,甚至幾百條內。
既然這樣,我們就只能跟需求方表示,這個查詢條件必須使用十分“明確”的數據
例如對于用戶,我們常常能用什么來明確指向一個用戶呢?
id,數據主鍵,手機號碼
我們如何確定一本書呢?我們可以用一個ISBN
修改這兩個查詢條件,才能將這個不能解決的問題,修改為解決
但是,有人說,我們是技術。不能對產品提這樣的想法,
但是我想說,你是打算在將來來查詢卡半分鐘的時候說,說服所有人這個東西不關我的事
還是說,在未開發(fā)前說服產品
到此這篇關于MySQL詳解如何優(yōu)化查詢條件的文章就介紹到這了,更多相關MySQL查詢條件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver&n
大家在連接mysql的時候,啟動項目,會警告你推薦使用com.mysql.cj.jdbc.Driver?而不是com.mysql.jdbc.Driver,本文主要介紹了com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的區(qū)別,具有一定的參考價值,感興趣的可以了解一下2024-03-03
淺談mysql雙層not exists查詢執(zhí)行流程
本文主要介紹了淺談mysql雙層not?exists查詢執(zhí)行流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06
完美解決mysql in條件語句只讀取一條信息問題的2種方案
使用mysql多表查詢時一個表中的某個字段作為另一表的in查詢條件,只能讀取一條信息,而直接用數字的話可以正常讀取2018-04-04
MySQL密碼策略管理插件validate_password用法詳解
自MySQL5.6起,引入validate_password插件,用于密碼長度和強度管理,在MySQL8.0中,該插件通過服務器組件重新實現(xiàn),插件默認不允許密碼為用戶名,可設定最小長度和強度等級,還可要求密碼包含數字、大小寫字母和特殊字符2024-11-11

