
三個表,Media(媒體表),Tags(標簽表),MediaTagRef(中間表)
三個表數量分別是:Media 5w,Tags 5w,MediaTagRef 80w
現在需要做關鍵字過濾查找媒體,Media.name LIKE '%1%' OR Tags LIKE '%1%'
SELECT
count(*)
FROM
(
SELECT
Media.id,Media.name
FROM
mc_media Media
LEFT JOIN mc_media_tag_ref TagRef ON TagRef.object_id = Media.id
LEFT JOIN mc_tags Tags ON Tags.id = TagRef.tag_id
WHERE Tags.name LIKE '%1%' OR Media.name LIKE '%1%'
#LIMIT 20
) c

結果:651455
受影響的行: 0
時間: 7.113s
回傳結果需要7秒多,這個有點接受不了,是那里寫錯了嗎?
就算把like去了也要7秒。
uj5u.com熱心網友回復:
SELECT
Media.id,
Media. NAME
FROM
mc_media Media
LEFT JOIN mc_media_tag_ref TagRef ON TagRef.object_id = Media.id
LEFT JOIN mc_tags Tags ON Tags.id = TagRef.tag_id
WHERE
Tags. NAME LIKE '%1%'
OR Media. NAME LIKE '%1%'
LIMIT 20
這樣查詢100ms以內,但無法知道總數,做不了分頁。
還請大家幫忙看看!!
uj5u.com熱心網友回復:
從where條件來看,兩個like 都是 %1% ,完全使用不到索引,性能當然會很差,另外需要觀察索引的過濾性如何,一遍過濾性在10%以內都認為可以有效使用索引!uj5u.com熱心網友回復:
就算把LIKE去掉也要7秒以上
uj5u.com熱心網友回復:
看執行計劃 瞅瞅uj5u.com熱心網友回復:
是圖2嗎?
uj5u.com熱心網友回復:
另外我有個想法,就是直接在Media里加一個tags欄位保存媒體的標簽,多個用','分隔,查詢時就不用關聯這么多表。不知道這種做法有什么弊端?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/72105.html
標籤:MySQL
下一篇:PostgreSQL安裝報錯求助
