检查mysql的索引是否为空

检查mysql的索引是否为空,mysql,query-optimization,Mysql,Query Optimization,基于此,我相信mysql确实索引空值。 我正在尝试优化sql server,我想知道该服务器是否有索引空值;有没有办法检查索引是否为空值?如果索引指向的表的列具有空值,则意味着该列也将位于索引中。据我所知,您无法查询索引本身是否为空值,但您始终可以使用列名称为空的条件检查列是否为空值,然后从那里开始。忽略,忽略,忽略 索引是否有0字节、1字节、2字节或几个空字节——这在总体方案中无关紧要 一个BTree(你说的是一个索引,它是BTree)深入到很少的级别(可能10亿行有5个级别)。即使索引中的每

基于此,我相信mysql确实索引空值。
我正在尝试优化sql server,我想知道该服务器是否有索引空值;有没有办法检查索引是否为空值?

如果索引指向的表的列具有空值,则意味着该列也将位于索引中。

据我所知,您无法查询索引本身是否为空值,但您始终可以使用
列名称为空的条件检查列是否为空值,然后从那里开始。

忽略,忽略,忽略

索引是否有0字节、1字节、2字节或几个空字节——这在总体方案中无关紧要

一个BTree(你说的是一个索引,它是BTree)深入到很少的级别(可能10亿行有5个级别)。即使索引中的每一行的大小都是原来的两倍,BTree也可能只有5层深。“5”是“点查询”的成本。这与条目中的绒毛无关

手册页面可能是MyISAM作为唯一引擎时的遗留问题。这样的细节不一定随着InnoDB的出现而更新,更不用说它的4
行格式了

也不要相信解释。当它说
Key\u len
时,它只给出了条目大小的线索

INT NOT NULL -- 4 -- meaning 4 bytes
INT     NULL -- 5 -- implying an extra byte for NULL
VARCHAR(10) CHARACTER SET utf8 -- 32 -- 2 for length (might be only 1) + 3*10

但是varchar不占用32字节;它们是可变长度的。

提到了一本旧的MySQL 5.1手册“SQL空值在记录目录中保留一个或两个字节。此外,如果存储在可变长度列中,SQL NULL值在记录的数据部分保留零字节。在固定长度列中,它在记录的数据部分保留该列的固定长度。为空值保留固定空间可以就地将列从空值更新为非空值,而不会导致索引页出现碎片。“因此
NULL
值确实存储在indexhmm中,但问题是我们如何知道它是否有任何列为NULL,从而减慢查询速度”但问题是我们如何知道它是否有任何列为NULL,从而减慢查询速度“
NULL
表示
”什么都没有“
在SQL中,关于在数据模型中是否正确使用
NULL
的问题也是如此。”。。因为您无法比较“好”和“坏”模型之间的性能,而“坏”模型是根据预期允许填写“无”的用户案例数据模型建模的,如果你明白我的意思,我不是说好的或坏的模型,我是说通过找到一种方法将空值从索引中抛出或以其他方式最小化空值,来减少查询必须扫描的行数。这里的用例是“我不知道我的任何索引中是否有空值,它们是空值吗?这些都会让我慢下来吗?”我说的是减少查询必须扫描的行数,方法是找到一种将空值从索引中抛出或以其他方式最小化空值的方法“唯一的方法是禁止
notnull
列中的
NULL
,这样索引就不能存储
NULL
值。否则,现在你知道我为什么提到“好”另一条评论中的“坏”模型