将MySQL表分成2个?目前的搜索太慢了

时间:2012-02-09 02:29:38

标签: mysql database database-design activerecord relational-database

我正在使用MySQL表来存储地图上的数据,这些数据将由用户搜索。该网站允许用户添加其他过滤器以缩小其结果。

主要MySQL查询:

SELECT listing_id, listings.property_1, property_2, address_1, address_2, city, listings.lat, listings.lng, img_subpath, photos, some_timestamp
    FROM table
    WHERE listings.lat BETWEEN 61.123 AND 61.124
    AND listings.lng BETWEEN 40.123 AND 40.124
    AND some_timestamp BETWEEN DATE_SUB( NOW(), INTERVAL 0 DAY) AND DATE_SUB( NOW(), INTERVAL 5 DAY)')
    JOIN (SELECT price, lat, lng, MAX(some_timestamp) as latest FROM listings GROUP BY price, lat, lng) as t2', 'listings.price=t2.price AND listings.lat=t2.lat AND listings.lng=t2.lng AND listings.some_timestamp=t2.latest', 'inner')
    LIMIT 200,0

列:

(索引列以粗体显示)

(以property_开头的列是可选的过滤器,但前两个除外)

  • listing_id int(8)
  • url varchar(255)
  • city varchar(32)
  • somename varchar(32)
  • 价格int(7)
  • price_per int(7)
  • property_1 int(2)
  • property_2 int(2)
  • address_1 varchar(255)
  • address_2 carchar(255)
  • city varchar(64)
  • state varchar(32)
  • postal int(6)
  • some_timestamp时间戳
  • another_timestamp timestamp
  • lat float(10)
  • lng float(10)
  • 说明文字
  • img_subpath varchar(15)
  • 照片文字
  • reply_email varchar(255)
  • phone varchar(16)
  • property_3 tinyint(1)
  • property_4 tinyint(1)
  • property_5 tinyint(1)
  • property_6 tinyint(1)
  • property_7 tinyint(1)
  • property_8 tinyint(1)
  • property_9 tinyint(1)
  • property_10 tinyint(1)
  • property_11 tinyint(1)
  • property_12 tinyint(1)
  • property_13 tinyint(1)
  • property_14 tinyint(1)

问题:数据库需要太长时间(3-4秒)才能获取结果。如何在非常相似的网站上加速<0.5秒?

我应该有2个表,第一个表只包含搜索中涉及的列,下一个表包含所有其他列。因此,当搜索发生时,它会搜索第一个表,获取结果的listing_id,然后使用IN子句从第二个表中检索所有其他数据?

请指教,谢谢!

2 个答案:

答案 0 :(得分:1)

我认为你试图用这个来获取过去五天的时间戳:

AND some_timestamp BETWEEN DATE_SUB( NOW(), INTERVAL 0 DAY)
AND DATE_SUB( NOW(), INTERVAL 5 DAY)')

如果是这种情况,它应该与

相同
AND some_timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 5 DAY)) AND NOW()

如果你没有带有未来值的some_timestamp的记录,你可以使用

AND some_timestamp > DATE_SUB(NOW(), INTERVAL 5 DAY))

现在,我认为这应该更快

SELECT listing_id, listings.property_1, property_2, address_1, address_2, city,
    listings.lat, listings.lng, img_subpath, photos, some_timestamp
FROM t2
LEFT JOIN listings
    ON (listings.price=t2.price AND listings.lat=t2.lat AND listings.lng=t2.lng
        AND t2.some_timestamp < listings.some_timestamp)
WHERE listings.lat BETWEEN 61.123 AND 61.124
    AND listings.lng BETWEEN 40.123 AND 40.124
    AND some_timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 5 DAY)) AND NOW()
    AND t2.some_timestamp is null
LIMIT 200

PS:我不认为拆分表会提高性能......实际上,如果你必须加入两个表来获得结果,那就需要更多

答案 1 :(得分:0)

你提出的建议在某种程度上是指数如何运作的理论。最有可能的是减速来自加入聚合子选择。我建议预先汇总这些信息(不能随意看到你不能的任何理由)以及加入该表。