关於mysql的基数问题
当前位置:首页 ----> Web开发 ----> Php
关键词: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 多好?呵呵。。。
原文出处:http://bbs.phpchina.com/viewthread.php?tid=1669