max的mysql索引,带where

max的mysql索引,带where,mysql,indexing,Mysql,Indexing,尝试获取最近计算的\u日期,其中标准化的\u全局\u分数不为空 SELECT max(`influencer_brand_scores`.computed_date) AS max_computed_date FROM `influencer_brand_scores` WHERE (normalized_global_score IS NOT NULL) 这个查询需要花费很长时间,当我运行explain时,我得到: 1简单影响者品牌使用where对所有(空)(空)(空)(空)(空)334

尝试获取最近计算的\u日期,其中标准化的\u全局\u分数不为空

SELECT max(`influencer_brand_scores`.computed_date) AS max_computed_date
FROM `influencer_brand_scores` 
WHERE (normalized_global_score IS NOT NULL) 
这个查询需要花费很长时间,当我运行explain时,我得到:

1简单影响者品牌使用where对所有(空)(空)(空)(空)(空)3347895进行评分

所以我的问题是,我应该在计算日期上添加一个索引,还是在标准化的全局分数和计算日期上添加一个复合索引,如果是这样,那么哪个应该是第一个,或者这有关系吗?

我会先选择

ALTER TABLE `influencer_brand_scores` 
    ADD INDEX `ibs_cindex` (`normalized_global_score`, `computed_date`);
INDEX( normalized_global_score, computed_date )
如果这不起作用(因为标准化的全局分数包含空值),则创建一个新的布尔列,名为
normalize\u gobalcolumn\u score\u is\u computed
,并索引:

INDEX( normalize_gobalcolumn_score_is_computed, computed_date )

在您的查询中,
normalized\u global\u score\u NOT NULL
替换为
normalize\u gobalcolumn\u score\u IS\u computed=TRUE

NULL
不利于索引,是否有理由存储
NULL
值?每晚都有一项任务来计算规范化的\u global\u分数,因此,该值可能会在一段时间内为空,因为计算它的复杂性,我看不到任何简单的方法来删除它。在这种情况下,我认为仅在
计算日期
上的索引要好得多,但是,我可能错了,请留下我posted@ajreal理论上你是对的。如果空值是数据库中相对较小的部分,那么这个索引可以很快更新。@Joelio!这应该足够快。一切都取决于您有多少个非空值。您好,谢谢,我不认为mysql支持ASC/DESC,不确定这在这种情况下有多重要。@Joelio理论上,排序可以增加在一步中选择正确起点的概率。当然,在这种情况下,它不会显著提高性能。无论如何,您是对的,我查看了文档,发现MySQL目前不支持索引排序:)不要相信使用布尔字段会快得多。布尔是TINYINT(1)的同义词,这种类型的列将被正确地索引和使用。我记得MySql总是在包含NULL的索引中遇到问题,所以我总是避免这样做,但我不确定这是否在MySql的较新版本中得到了解决。从数学角度来看,NULL值不可能是问题所在。问题在于数据分布。例如,如果所有表都有非空值,而只有几个记录有空值,那么这个特定查询的速度可能会很慢。但是真/假分布与空/非空分布相同,因此查询速度可能仍然很慢。这里不是关于数学,而是关于MySql如何实现,当您有一个可能为空的
INT
列,您说
列不为空时,以及当您有一个
TINYINT(1)时,它的行为不一样当您说
column=1
时,NOTNULL
column。NULL在b树中没有什么特别的。布尔的唯一优点是索引深度。