mysql - 大表慢SQL,按时间戳过滤(int12)

标签 mysql sql

我遇到查询速度慢的问题,进行“简单”选择..我不明白问题是什么...这是一个大表..但这是一个简单的查询..

表格:

business: (1.000.000 reg)
id (INDEX PRIMARY INT(11) UNSIGNED)
active (INDEX TINYINT(1))

products: (32.000.000 reg)
id (INDEX PRIMARY INT(11) UNSIGNED)
business_id (INDEX INT(11) UNSIGNED)
offer_start (INDEX INT(12) UNSIGNED) (timestam unix)
offer_end (INDEX INT(12) UNSIGNED) (timestamp unix)
price_offer (VARCHAR(10)) (price with decimals)
active (INDEX TINYINT(1))

business.id、products.id、products.offer_start 和 products.offer_end 是索引(分隔)

当我这样做时:

SELECT SQL_NO_CACHE * FROM products 
LEFT JOIN business ON business.id = products.business_id 
WHERE
 (business.active = '1' AND business.paylimit > 1314029906) 
AND 
 (products.active = '1' AND products.offer_start < 1314029906 AND products.offer_end > 1314029906 AND products.price_offer > 0) 
LIMIT 0,10

需要 21 秒。 问题是这样的:products.offer_start < 1314029906 AND products.offer_end > 1314029906大约需要 20 秒才能给出结果

是否可以进行此查询,过滤其他表单以加快速度?

最佳答案

有关表架构的一些注释:

  1. offer_start (INDEX INT(12) UNSIGNED) - 12 没有意义,因为 INT 中的最大符号为 11。offer_end 相同
  2. active (INDEX TINYINT(1)) - 索引无用,因为 1000000 的基数将为 2 - 1 或 0
  3. price_offer (VARCHAR(10)) - 您可以使用 float 或小数。 products.price_offer > 0 会更快。

关于mysql - 大表慢SQL,按时间戳过滤(int12),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7151357/

相关文章:

php - Mysql 帮助更新具有其他 ID 的价格的行

sql - 使用 CURRENT_TIMESTAMP 查询时间戳分区表的效率

Mysql:创建一个仅显示一对多关系子集的 View

mysql - 如何在按月分组时获取最近 3 个月的记录

php - 从不同的Mysql表中获取具有相同名称的列

php - 你如何为 Laravel 中是否存在记录设置 bool 值?

sql - 比较 2 个不同行和列之间的日期

php - 显然更新查询没有错误,但记录没有更新

php - 从 HTMl 表单的动态选择选项中删除重复数据

sql - 根据另一个表中的数据更新 SQLite 表