2015-04-22 109 views
3

我有3列我正在搜索的數據:description(fulltext),lat(index)和lon(index)。MySQL全文索引和常規索引搜索

當我做SELECT id FROM table MATCH(description) AGAINST ('query' IN BOOLEAN MODE)一切都迅速處理,並正常工作。

當我做SELECT id FROM table WHERE lat BETWEEN a and b AND lon BETWEEN x and y一切都迅速處理,並正常工作。

當我把兩個where子句和一個簡單的AND合併在一起時,一切正常,但需要幾秒鐘來處理。

前兩個查詢需要0.1秒,最後一個需要3秒以上,我似乎無法弄清楚如何讓它運行得更快。描述是全文索引,經緯度列是正常索引。

任何想法是什麼在放慢速度和/或如何解決它?該表是InnoDB。

+0

這很奇怪。請爲緩慢查詢提供'EXPLAIN SELECT ...'。 –

+1

當然,它只會使用查詢的兩個索引之一。 –

+0

select_type = SIMPLE,type = fulltext,possible_keys = ,key = search_fulltext,extra = Using where;使用filesort – user2247281

回答

1

增速放緩的原因...請注意前兩個SELECTs各自如何返回id。這很便宜,因爲該ID包含在任何二級索引中。

但是當你有兩個部分的WHERE,一個索引(FULLTEXT)是用來獲取的ID,然後查找該行獲得的值(latlng)所需WHERE的另一部分。這涉及另一個BTree的另一個查詢。如果所有需要的東西都在RAM中,那也不算太壞。但是,如果您需要打開磁盤...

讓我們來檢查一個可能的修復...您有多少RAM? innodb_buffer_pool_size的值是多少?該設置通常應爲可用RAM的70%(假設您的存儲容量超過4GB)。將其提高到此值可能會減少執行復雜查詢所需的I/O,從而加快速度。

如果這樣不起作用,我有a technique,它可以有效地處理經緯度/經度搜索。我還沒有嘗試過FULLTEXT,所以它可能會有一些意想不到的怪癖。然而,它對於經緯度搜索非常有效(比僅使用普通的INDEX更好)。

+0

這是一個帶有7的Amazon RDS實例。5 GB的RAM和整個數據庫足夠小,可容納在內存中 - 每小時只有1或2個磁盤讀取次數。 innodb_buffer_pool_size設置爲5.7 gb。 lat lon查找是爲了計算距離的半正弦方程而縮小結果,所以不是計算500k行的正弦半徑方程,而是在我們緯度/經度窗口內做100個左右。緯度/經度窗口是正方形的,而我們的最終結果是一個圓圈(搜索半徑)。 – user2247281