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秒才能给出结果
是否可以进行此查询,过滤其他表单以加快速度?有关表架构的一些注意事项:
从产品中选择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