【发布时间】:2012-02-09 02:29:38
【问题描述】:
我正在使用 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_ 开头的列是可选过滤器,前 2 个除外)
- 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)
- 状态 varchar(32)
- 邮政整数(6)
- some_timestamp 时间戳
- another_timestamp 时间戳
- 纬度浮点数(10)
- lng 浮点数(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 秒)。如何在非常相似的网站上将其加速到
如果我有 2 个表,第一个表将只包含搜索中涉及的列,而下一个表包含所有其他列。所以当搜索发生时,它会搜索第一个表,获取结果的listing_id,然后使用IN 子句从第二个表中检索所有其他数据?
请指教,谢谢!
【问题讨论】:
-
您的查询在自连接/子选择中出现了一些语法错误,因为您已将其粘贴在上面。
-
我正在使用 Codeigniter 的活动记录语法并尝试转换为完整的 MySQL 查询。不太清楚实际的 SQL 代码如何
标签: mysql database database-design activerecord relational-database