Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用布尔值优化Mysql查询_Mysql_Sql_Query Optimization - Fatal编程技术网

用布尔值优化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”移到了第一位,但不幸的是,执行速度与以前一样。谢谢。我看不出这个问题和原来的问题有什么本质区别。