最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL詳解如何優(yōu)化查詢條件

 更新時(shí)間:2022年05月21日 08:43:54   作者:會(huì)噴火才能叫火山  
我們知道從MySQL表中使用SELECT語句來查詢數(shù)據(jù),如需有條件地從表中選取數(shù)據(jù),可將WHERE子句添加到SELECT語句中,本篇我們來看看怎樣優(yōu)化查詢條件

前言

技術(shù)能解決的事情改技術(shù)

技術(shù)解決不了的事情該需求

現(xiàn)狀

假設(shè)我們目前有兩張表

業(yè)務(wù)表 書( t_a_book ) 閱讀歷史記錄表 (t_r_book_history) 用戶表

其兩張表的數(shù)據(jù)邏輯如下

t_a_book

t_r_book_history

t_a_user

當(dāng)然了,我們假設(shè)當(dāng)前的數(shù)據(jù)量并不只是我們眼前看到的這幾條數(shù)據(jù),而是線上真實(shí)情況。

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

問題一

這時(shí)候,我們需要面臨第一個(gè)業(yè)務(wù)問題,

我們需要做一個(gè)報(bào)表,顯示用戶閱讀圖書的記錄,并顯示用戶名,用戶號(hào),書名

這時(shí)候我們?nèi)绾卧O(shè)計(jì)查詢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;

查詢出來的結(jié)果為

其邏輯為

  • 數(shù)據(jù)庫根據(jù)release_time倒序查詢數(shù)據(jù)表,取出倒序的數(shù)據(jù)
  • 根據(jù)左連接獲取 用戶信息
  • 根據(jù)左連接獲取 圖書信息

單表查詢

如果此時(shí)我們選擇化繁為簡,使用單表的查詢方法,來查詢數(shù)據(jù)其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 ();

其數(shù)據(jù)邏輯與多表聯(lián)查一致,唯一不同的便是需要查詢?nèi)?/p>

結(jié)論

我們可以看,當(dāng)前兩種查詢方式的邏輯來看。

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

當(dāng)數(shù)據(jù)量大的時(shí)候,我們只需要根據(jù)release_time 做索引,簡化這一步的操作。

后續(xù)都可以使用主鍵來簡化操作

由此來看,兩個(gè)語句其實(shí)在本質(zhì)上沒有明顯的快慢之分

問題二

現(xiàn)在我們需要增加兩個(gè)查詢條件

  • 用戶名稱,支持模糊查詢
  • 書名信息,支持模糊查詢

如果這時(shí)候,我們?nèi)绾尉帉慡QL

多表聯(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;

顯示的數(shù)據(jù)

其邏輯為

  • 查詢用戶表,根據(jù)其用戶名稱進(jìn)行模糊查詢
  • 查詢書表,根據(jù)書名進(jìn)行模糊查詢
  • 根據(jù)用戶主鍵,書籍主鍵作為查詢條件來進(jìn)行查詢

單表查詢

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 這三張表都是大表,

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

簡單的說 , 無論我們使用哪種方法, 都有可能會(huì)出現(xiàn)幾十萬個(gè)符合的結(jié)果

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

如何解決

文章寫到這里,我們會(huì)發(fā)現(xiàn)這個(gè)問題,已經(jīng)不能停留再技術(shù)成面的問題。

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

我們這里的問題 , 是這兩張表的查詢條件。他十分的模糊,我們無法將范圍限制在幾條,幾十條,甚至幾百條內(nèi)。

既然這樣,我們就只能跟需求方表示,這個(gè)查詢條件必須使用十分“明確”的數(shù)據(jù)

例如對(duì)于用戶,我們常常能用什么來明確指向一個(gè)用戶呢?

id,數(shù)據(jù)主鍵,手機(jī)號(hào)碼

我們?nèi)绾未_定一本書呢?我們可以用一個(gè)ISBN

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

但是,有人說,我們是技術(shù)。不能對(duì)產(chǎn)品提這樣的想法,

但是我想說,你是打算在將來來查詢卡半分鐘的時(shí)候說,說服所有人這個(gè)東西不關(guān)我的事

還是說,在未開發(fā)前說服產(chǎn)品

到此這篇關(guān)于MySQL詳解如何優(yōu)化查詢條件的文章就介紹到這了,更多相關(guān)MySQL查詢條件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的區(qū)別

    com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver&n

    大家在連接mysql的時(shí)候,啟動(dòng)項(xiàng)目,會(huì)警告你推薦使用com.mysql.cj.jdbc.Driver?而不是com.mysql.jdbc.Driver,本文主要介紹了com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Oracle與MySQL的區(qū)別及優(yōu)缺點(diǎn)

    Oracle與MySQL的區(qū)別及優(yōu)缺點(diǎn)

    這篇文章主要介紹了Oracle與MySQL的區(qū)別及優(yōu)缺點(diǎn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參加一下
    2022-08-08
  • 淺談mysql雙層not exists查詢執(zhí)行流程

    淺談mysql雙層not exists查詢執(zhí)行流程

    本文主要介紹了淺談mysql雙層not?exists查詢執(zhí)行流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • MySQL主鍵批量修改的坑與解決方案

    MySQL主鍵批量修改的坑與解決方案

    在日常開發(fā)中,我們可能會(huì)遇到需要批量修改 MySQL 數(shù)據(jù)表主鍵的情況,乍一看,修改主鍵 ID 似乎是一個(gè)簡單的操作,但如果處理不當(dāng),會(huì)導(dǎo)致操作失敗甚至數(shù)據(jù)丟失,本文將詳細(xì)剖析問題成因,并總結(jié)多種安全高效的解決方案,需要的朋友可以參考下
    2024-12-12
  • 完美解決mysql in條件語句只讀取一條信息問題的2種方案

    完美解決mysql in條件語句只讀取一條信息問題的2種方案

    使用mysql多表查詢時(shí)一個(gè)表中的某個(gè)字段作為另一表的in查詢條件,只能讀取一條信息,而直接用數(shù)字的話可以正常讀取
    2018-04-04
  • MySQL密碼策略管理插件validate_password用法詳解

    MySQL密碼策略管理插件validate_password用法詳解

    自MySQL5.6起,引入validate_password插件,用于密碼長度和強(qiáng)度管理,在MySQL8.0中,該插件通過服務(wù)器組件重新實(shí)現(xiàn),插件默認(rèn)不允許密碼為用戶名,可設(shè)定最小長度和強(qiáng)度等級(jí),還可要求密碼包含數(shù)字、大小寫字母和特殊字符
    2024-11-11
  • 與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(五)--運(yùn)算符

    與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(五)--運(yùn)算符

    MYSQL中的運(yùn)算符很多,這一節(jié)主要講MYSQL中有的,而SQLSERVER沒有的運(yùn)算符
    2014-06-06
  • MySQL中處理各種重復(fù)的一些方法

    MySQL中處理各種重復(fù)的一些方法

    這篇文章主要介紹了MySQL中處理各種重復(fù)的一些方法,包括對(duì)表和查詢結(jié)果的重復(fù)的一些處理,需要的朋友可以參考下
    2015-05-05
  • MySQL日志系統(tǒng)詳細(xì)資料分享

    MySQL日志系統(tǒng)詳細(xì)資料分享

    本文給大家匯總介紹了一下MySQL中的日志系統(tǒng)的詳細(xì)資料,非常的細(xì)致,有需要的小伙伴可以參考下
    2017-02-02
  • mysql主從同步原理及應(yīng)用場景示例詳解

    mysql主從同步原理及應(yīng)用場景示例詳解

    這篇文章主要為大家介紹了mysql主從同步原理及應(yīng)用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評(píng)論

平山县| 静宁县| 巴林左旗| 明水县| 贵德县| 本溪| 江油市| 乐陵市| 肥城市| 壶关县| 蕲春县| 普定县| 顺昌县| 建始县| 广灵县| 阜新市| 平和县| 凤冈县| 香格里拉县| 海安县| 开化县| 克什克腾旗| 信丰县| 南城县| 铜山县| 博客| 汉中市| 馆陶县| 乾安县| 青州市| 蚌埠市| 华蓥市| 仪征市| 富民县| 金门县| 若尔盖县| 屯昌县| 项城市| 阿拉尔市| 扶沟县| 独山县|