关於mysql的基数问题
关键词:mysql,mysql test,user,rows
xiaoqin_007: 关於mysql的基数问题
向各位请问个问题:我的mysql test库下有两张表test,user我分别对两张表各建一个复合索引, 在运用索引检索时,基数为“无”的那张表检索速度快(rows 值小),基数有数的那张表速度慢(rows 值大),不知哪位能解释一下,感谢了!
seraph: 基数为无?不明。xiaoqin_007: 不好意思,那个"无"是在admin中看到的 ”命令提示符“下是: mysql> show index from users; +-------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation| Cardinality | Sub_part | Packed | Null | Index_type | Comment | +-------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | users | 1 | firstname_count | 1 | firstname | A| 11 | NULL | NULL | | BTREE | | | users | 1 | firstname_count | 2 | count | A| 11 | NULL | NULL | | BTREE | | +-------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 2 rows in set (0.05 sec) mysql> show index from goods; +-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | goods | 0 | PRIMARY | 1 | id | A | 5 | NULL | NULL | | BTREE | | | goods | 1 | count_name | 1 | count | A | NULL | NULL | NULL | | BTREE | | | goods | 1 | count_name | 2 | name | A | NULL | NULL | NULL | | BTREE | | +-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 3 rows in set (0.05 sec)xiaoqin_007: 区别就在于 Cardinality 字段,一个是NULL(快),另一个就是11(慢); 我是在做索引的时候碰到的,在两个字段做复合索引后,检索速度,我用explain看rows应当为1,但事实是rows为一个非1数,即先安索引中的一个字段查询后再查询--这就是不合理的地方。 我在两张表做了试验,发现在基数为null的能达到目的,而基数为11的不可以。 (可能也不是基数引起的,我只是对比排除了一下,发现两者基数不同) 希望哪位高手能解释一下,感谢!seraph: 关注一下。。。weiwei: 二叉算法对空值就这样ysixin: 引用:原帖由 xiaoqin_007 于 2005-12-21 09:28 发表 区别就在于 Cardinality 字段,一个是NULL(快),另一个就是11(慢); 我是在做索引的时候碰到的,在两个字段做复合索引后,检索速度,我用explain看rows应当为1,但事实是rows为一个非1数,即先安索引中的一 ... 很高兴看到这样的提问,我也不是很懂 有机会多多讨论一下啊 我的msn me@xinee.net 我的理解是: 假如您需要的结果是100行 那么,假如explain的结果也是100 或接近100,那么您的索引就是非常正确的 您的基数为1,可能是您表中的各种类型的数据太少 总的来说,确实是基数越小,效率越高 个人观点,不正确的,欢迎各位指出!xiaoqin_007: rows 为1 ,是配合我做的复合索引在表中找到的唯一的一条记录。 刚刚向ysixin 请问了一下,发现是count字段类型的问题,我原来设的是“varchar”,改为“int"后,基数变成了2,再运行explain select email from users where firstname='qin' and count='1';rows 就变为1了。 今天来不及向它请问为什麽这样就可以了,哪位高手能指教一下? 窃想:假如能把基数都改位null 多好?呵呵。。。