數據庫中有josn格式的數據。


id         uid                     info
1        1001         {"name":"週年慶","status":0,"addtime":"2017-10-10"}
2        1002         [ {"name":"週年慶","status":0,"addtime":"2017-10-11"},{"name":"特價促銷","status":0,"addtime":"2017-10-12"}]
3        1003         [ {"name":"特價促銷","status":0,"addtime":"2017-10-12"},{"name":"國慶促銷","status":0,"addtime":"2017-09-28"}]

 

查詢語句:select * from tb where info->'$.name' = '特價促銷'  or JSON_CONTAINS(info->'$[*].name', '"特價促銷"', '$')

 

順便提一個問題:兩次查詢還是join查詢好?

曾遇到的一個慢sql調優,爲方便簡單寫:步驟一,

select tableA.id as ids from tableA where age>20;

步驟二,使用上一步的查詢結果:

select tableB.score from tableB where id in (ids);

這是一個很常見的查詢,步驟一和步驟二,相當於

select tableB.score from tableB inner join tableA on tableA.id=tableB.id;

爲什麼互聯網公司不讓使用join?

第一,不利於寫操作。執行讀操作時,會鎖住被讀的數據,阻塞其他業務對該部分數據的更新操作(U or D)。如果涉及多個聚合函數(緩存中沒有max or min時),相當於同時鎖住多張表,不能進行讀寫,直接影響其他業務,這影響了系統的整體性能;

第二,不利於維護。業務發生變動時,比如join中一張表改了,可能導致系統中原有的sql不可用,最終導致基於該SQL執行結果的上層顯示失敗(也意味着以往的開發工作已無效)。

如果不join呢?下面這個例子就不好了。

舉個例子你就明白了。比如,要統計2017年每個月的用戶訪問分佈量(沒訪問的佔比,訪問1-5次的佔比,訪問6-10次的佔比……)。這是一個簡單的連接問題(用戶表左連接訪問表)。用多表連接,你本可以從服務器端取回12行數據的(1-12月),結果你用了兩次單表查詢,從以上兩個表裏各取回了數萬乃至上百萬條數據,然後去做循環……這種程序員是腦殘吧?

結論: 分情況處理,小表業務量不大就一句inner join算了。維護就維護吧。

然後補一個好的模板去寫inner join 的sql句子。

SELECT 

      A.id AS AID,

      A.content AS AContent,

      B.id AS BID,

      B.content AS BContent,

      C.id AS CID,

      C.content AS CContent

FROM   

         A

         INNER JOIN B   ON    (A.id = B.id)

         INNER JOIN C   ON   (A.id = C.id)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章