当IFNULL()与my MYSQL db的性能差异为NULL时,如何调整my MYSQL db
如何调整我的MYSQL数据库? 我发现IFNULL()和is NULL之间的性能差别很大当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秒 我的数据库在虚拟机中运行,大约有一万条记录:
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
将由此索引处理,不需要在单独的条件下合并。请参阅。我已经了解了!它非常有效!非常感谢你!