我正在使用MySQL 5.5。我有一個查詢(全文)使用子查詢。爲了提高性能和我正在使用分頁的事實,我使用LIMIT來限制結果的數量。優化計數並選擇查詢
SELECT *
FROM (
SELECT id, type, type_id, content, MATCH(content) AGAINST('john') as relevance, IFNULL (parent_type, UUID()) as parent_type, IFNULL(parent_id, UUID()) as parent_id
FROM search_index
WHERE MATCH(content) AGAINST('john*' IN BOOLEAN MODE) GROUP BY parent_type, parent_id) as search
GROUP BY search.type, search.type_id DESC LIMIT 10;
除此之外,我需要發回每個搜索查詢的例子(50000)的可能結果的總數。要得到計數,我正在使用:
SELECT COUNT(*) FROM(
SELECT *
FROM (
SELECT id, type, type_id, content, MATCH(content) AGAINST('john') as relevance, IFNULL (parent_type, UUID()) as parent_type, IFNULL(parent_id, UUID()) as parent_id
FROM search_index
WHERE MATCH(content) AGAINST('john*' IN BOOLEAN MODE) GROUP BY parent_type, parent_id) as search
GROUP BY search.type, search.type_id) as count;
雖然這確實讓我有些不安。下面是計數查詢的解釋:
search_index
是content
一個全文索引。 search_index_no_ft
是除了content
和id
以外的所有列的索引。 id
上有一個主鍵。
有沒有更好的方法來做到這一點,也許是一種優化這種方式?或者,有沒有辦法將2個查詢(計數和搜索)合併爲1?
你真的需要確切數量的比賽嗎?谷歌必須有一個原因顯示只有估計... – piotrm 2012-04-25 07:36:37
我需要確切的匹配數量來生成在大多數情況下工作的分頁,例如,當過濾和搜索用戶列表等。如果這是一個普通的網站,因爲數據量如此之大以至於用戶永遠無法完成全部搜索,所以我對估計感到滿意。所以是的,我需要一個完全匹配的用例。 – F21 2012-04-25 08:20:52
無論如何,如果你讓他們這樣做,有些用戶會試圖通過所有這些,濫用基於限制的網站中的最高偏移量是一種常見的DOS攻擊類型。 – piotrm 2012-04-25 08:28:09