将MySQL表拆分为2?当前搜索速度太慢

将MySQL表拆分为2?当前搜索速度太慢,mysql,database,database-design,activerecord,relational-database,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 BE

我使用一个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
列:

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
(索引列以粗体显示)

(以
属性
开头的列是可选的筛选器,前2个除外)

  • 清单8
  • url varchar(255)
  • 城市瓦查尔(32)
  • somename varchar(32)
  • price int(7)
  • 每个整数的价格(7)
  • 属性\u 1 int(2)
  • 属性_2 int(2)
  • 地址_1 varchar(255)
  • 地址_2 carchar(255)
  • 城市瓦查尔(64)
  • state varchar(32)
  • 邮政国际(6)
  • 某些时间戳时间戳
  • 另一个时间戳
  • 横向浮动(10)
  • 液化天然气浮子(10)
  • 描述文本
  • img_子路径varchar(15)
  • 照片文本
  • 回复电子邮件varchar(255)
  • 电话varchar(16)
  • 不动产3小罐(1)
  • 不动产tinyint(1)
  • 不动产(1)
  • 不动产_6 tinyint(1)
  • 不动产_7 tinyint(1)
  • 不动产_8 tinyint(1)
  • 不动产(1)
  • 物业_10 tinyint(1)
  • 不动产_11 tinyint(1)
  • 不动产(1)
  • 不动产_13 tinyint(1)
  • 不动产_14 tinyint(1)

问题:数据库获取结果的时间太长(3-4秒)。如何将其加速到你所提出的在某种程度上是指数工作原理背后的理论。最有可能的原因是加入聚合子选择。我建议预先聚合该信息(不能立即看到任何不能聚合的原因)并针对该表进行连接

我想你是想用这个来获取过去五天的时间戳:

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()
如果您没有带有未来值的时间戳的记录,您可以使用

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
选择listing\u id、listings.property\u 1、property\u 2、address\u 1、address\u 2、city、,
listings.lat、listings.lng、img_子路径、照片、一些时间戳
从t2开始
左连接列表
ON(listings.price=t2.price和listings.lat=t2.lat和listings.lng=t2.lng
和t2.some_timestamp

PS:我不认为拆分表会大大提高性能。。。实际上,如果您必须连接两个表才能得到结果,那么需要更多的时间

您的查询在上面粘贴的self-join/subselect上出现了一些语法错误。我正在使用Codeigniter的活动记录语法,并尝试转换为完整的MySQL查询。不太确定实际的SQL代码是什么样子的