Mysql 大表中的慢SQL,按时间戳过滤(int12)

Mysql 大表中的慢SQL,按时间戳过滤(int12),mysql,sql,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) offe

我有一个问题,查询速度慢,选择“简单”。。我不明白是什么问题。。。这是一张大桌子。。但这是一个简单的查询

各表:

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\u开始和products.offer\u结束是索引(分开)

当我这样做的时候:

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
从产品中选择SQL\u NO\u缓存*
在business.id=products.business\u id上左键加入业务
哪里
(business.active='1'和business.paylimit>131402906)
及
(products.active='1'和products.offer\u start<1314029906和products.offer\u end>1314029906和products.price\u offer>0)
限值0,10
花21秒。 问题是:
products.offer\u start<1314029906和products.offer\u end>1314029906
需要约20秒才能给出结果


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

有关表架构的一些注意事项:

  • offer_start(INDEX INT(12)UNSIGNED)-12没有意义,因为INT中的最大符号是11。同样的报价单
  • 活动(索引TINYINT(1))-索引无效,因为1000000上的基数将为2-1或0
  • price_offer(VARCHAR(10))-您可以使用float或decimal进行此操作。products.price\u offer>0将更快地工作
  • 试一试

    从产品中选择SQL\u NO\u缓存*
    在business.id=products.business\u id上左键加入业务
    其中business.paylimit>1314029906
    和产品。提供\u开始<1314029906
    和产品。报价>1314029906
    和产品。价格\报价>0
    和business.active='1'
    限值0,10
    
    MySQL从左到右处理过滤器,因此确保最有选择性(返回最少行)的条件位于左侧。将
    business.active='1'
    放在条件的最左侧可以使用索引,但如果其选择性为50%,则条件的其余部分不使用索引

    您可能需要阅读手册中的内容

    编辑:
    关于MySQL如何使用索引的简短解释:

    您能提供解释计划吗?您可能也得到了错误的答案。其中(business.active='1'和business.paylimit>131402906)将左连接更改为内部连接,因为它必须满足该条件。offer\u start和offer\u end上的确切索引是什么?它们是两个独立的索引吗?索引是否包含任何其他列?切勿使用浮点值作为价格,这里的小数是正确的类型
    SELECT SQL_NO_CACHE * FROM products 
        LEFT JOIN business ON business.id = products.business_id 
    WHERE business.paylimit > 1314029906
        AND products.offer_start < 1314029906
        AND products.offer_end > 1314029906
        AND products.price_offer > 0
        AND business.active = '1'
    LIMIT 0,10