mysql - 将 MySQL 表分成 2 个?当前搜索速度太慢

标签 mysql database database-design activerecord relational-database

我正在使用 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/

相关文章:

mysql - 如何将两个 COUNT() 语句合二为一并求出差值?

php - AJAX 实时插入删除搜索,显示项目 2 次

database-design - DNA转换域名的最大长度是多少?

database - 删除数据库用户是否会触发用户在其他模式的表上引发?

postgresql - JSON 值的模式匹配

database-design - 在数据库模式中链接应付账款和总账

php - 将 IDX MLS 集成到网站中

MySql 连接超过 2 个表?

php - 损坏的文件图标从数据库 php 和 mysql 中检索图像

java - 在带有 FTS4 的房间数据库中从 Long 更改为 Int of `rowid`