用布尔值优化Mysql查询
我有这张桌子:用布尔值优化Mysql查询,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,我有这张桌子: CREATE TABLE IF NOT EXISTS `products` ( `product_id` int(11) NOT NULL AUTO_INCREMENT, `supplier_id` int(11) NOT NULL, `allowed` varchar(256) NOT NULL, `blocked` varchar(256) NOT NULL, `approved` tinyint(1) NOT NULL DEFAULT '0', PR
CREATE TABLE IF NOT EXISTS `products` (
`product_id` int(11) NOT NULL AUTO_INCREMENT,
`supplier_id` int(11) NOT NULL,
`allowed` varchar(256) NOT NULL,
`blocked` varchar(256) NOT NULL,
`approved` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`product_id`),
KEY `supplier_id` (`supplier_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
“已批准”是一个布尔0/1字段“阻止”和“允许”保留国家代码,如“美国CA FR” 我运行以下查询:
SELECT DISTINCT supplier_id
FROM products
WHERE (
supplier_id=0 OR
supplier_id = 1207077 OR
supplier_id = 1207087 OR
supplier_id = 1207079 OR
supplier_id = 1207082 OR
supplier_id = 1207083 OR
supplier_id = 1207086 OR
supplier_id = 1207084 OR
supplier_id = 1207078 OR
supplier_id = 1207085 OR
supplier_id = 1207094 OR
supplier_id = 1207097 OR
supplier_id = 1207095 OR
supplier_id = 1207089 OR
supplier_id = 1207091
) AND (
(`blocked` NOT LIKE '%US%' AND `allowed` ='') OR
`allowed` LIKE '%US%'
) AND approved=1;
运行时间约为0.02秒。对如何优化它有什么建议吗?谢谢。执行速度是相同的,因为OR和非左锚定LIKE子句不能正确使用索引。在US FR etc字段中,您的表设计很糟糕,应该在您加入的另一个表中。如果您坚持自己的设计,并且表非常大,那么请为供应商id或子句创建一个派生表,然后对同一个表进行联接,以查找其余的匹配项。这也可能需要一个联盟,因为你有其他的OR。有关更多信息:
http://dev.mysql.com/doc/refman/5.6/en/index-btree-hash.html
我通过以下方式对其进行了优化:
SELECT DISTINCT supplier_id FROM products WHERE ((`blocked` NOT LIKE '%US%' AND
`allowed` ='') OR `allowed` LIKE '%US%') AND approved=1 AND supplier_id IN (1207077,
1207087, 1207079, 1207082, 1207083, 1207086, 1207084, 1207078, 1207085, 1207094,
1207097, 1207095, 1207089, 1207091);
它现在以0.0004s的速度运行
感谢winmutt为我指出了正确的方向:-)添加供应商id、已批准、已阻止和允许的索引。在和条款中,让approved排在第一位您还可以删除所有这些OR,并在(0,1207077,1207087,…)中使用supplier_id@Brian它在后台也是一样的……不会提高性能。@Steve-我按照您的建议添加了索引,并将WHERE条款中的“approved”移到了第一位,但不幸的是,执行速度与以前一样。谢谢。我看不出这个问题和原来的问题有什么本质区别。