我正在使用 MySQL 表来存储用户将搜索的 map 上的事物数据。该网站允许用户添加额外的过滤器来缩小结果范围。
主要 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_
开头的列是可选过滤器,前 2 列除外)
- listing_id int(8)
- url varchar(255)
- 城市 varchar(32)
- somename varchar(32)
- 价格整数(7)
- price_per int(7)
- property_1 int(2)
- property_2 int(2)
- address_1 varchar(255)
- address_2 carchar(255)
- 城市 varchar(64)
- 状态 varchar(32)
- 邮政整数(6)
- some_timestamp 时间戳
- another_timestamp 时间戳
- 纬度 float (10)
- lng float (10)
- 描述文字
- img_subpath varchar(15)
- 照片文字
- reply_email varchar(255)
- 电话 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
子句从第二个表中检索所有其他数据?
请指教,谢谢!
最佳答案
我认为您正在尝试使用以下命令获取过去五天的时间戳:
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()
如果您没有包含具有 future 值的 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:我不认为拆分表会提高性能多少...实际上,如果您必须连接两个表才能获得结果,则需要更多时间
关于mysql - 将 MySQL 表分成 2 个?当前搜索速度太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204618/