Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
当IFNULL()与my MYSQL db的性能差异为NULL时,如何调整my MYSQL db_Mysql_Performance - Fatal编程技术网

当IFNULL()与my MYSQL db的性能差异为NULL时,如何调整my MYSQL db

当IFNULL()与my MYSQL db的性能差异为NULL时,如何调整my MYSQL db,mysql,performance,Mysql,Performance,如何调整我的MYSQL数据库? 我发现IFNULL()和is NULL之间的性能差别很大 SELECT dtime,id FROM salesdata WHERE confirm!=1 OR confirm IS NULL ; 持续时间/提取时间:0.0034秒 使用指标条件;使用where' SELECT dtime,id FROM salesdata WHERE IFNULL(confirm,0)!=1 ; 持续时间/提取时间:4.680秒 我的数据库在虚拟机中运行,大约有一万条记录:

如何调整我的MYSQL数据库? 我发现IFNULL()和is NULL之间的性能差别很大

SELECT dtime,id FROM salesdata WHERE confirm!=1 OR confirm IS NULL ;
持续时间/提取时间:0.0034秒 使用指标条件;使用where'

SELECT dtime,id FROM salesdata WHERE IFNULL(confirm,0)!=1 ;
持续时间/提取时间:4.680秒

我的数据库在虚拟机中运行,大约有一万条记录:

$ mysql --version
mysql  Ver 15.1 Distrib 10.1.41-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
任何帮助都将不胜感激

更新:(我根据Akina的指南添加了更多信息)

持续时间/提取时间:0.0034秒

使用指标条件;使用where'

SELECT dtime,id FROM salesdata WHERE IFNULL(confirm,0)!=1 ;
vs

持续时间/提取时间:4.680秒

“使用where”

SELECT dtime,id FROM salesdata WHERE IFNULL(confirm,0)!=1 ;

这意味着IFNULL()的性能不好?或者我的数据库有问题

对性能来说很糟糕——优化器对此无能为力;它必须扫描整个表(或索引)

=
可能因为类似的原因而很糟糕

如果
confirm
有两种状态,则最干净的状态为

confirm  TINYINT UNSIGNED  NOT NULL  DEFAULT '0'
必要时,将其设置为
1
。并且仅将这些用于测试:

WHERE confirm = 0 AND ...
WHERE confirm = 1 AND ...
当使用类似的
WHERE
子句时,使用以
confirm
开头的复合索引

谢谢你的提问

SELECT dtime,id FROM salesdata WHERE confirm = 0

最佳的
索引将是
索引(确认、数据时间、id)
。如果您有其他测试
确认
的查询,请显示它们,以便我可以推荐其他索引。(有多种模式,取决于几个因素。)

请参见解释。函数终止索引使用。谢谢!我更新了我的问题:)这意味着IFNULL()的性能不好?这意味着您必须使用与字段相关的表达式,将字段部分存储在索引中使用的那些状态中。如果您有索引
表(确认[,…])
则必须使用第一个变量-每个单独的条件
确认=1
确认为空
将按索引处理。而
IFNULL(确认,0)=1
不能。但如果您使用表达式
IFNULL(confirm,0)
创建计算字段并对其进行索引,则第二个表单将更有效,因为
IFNULL(confirm,0)=1
将由此索引处理,不需要在单独的条件下合并。请参阅。我已经了解了!它非常有效!非常感谢你!