免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2955 | 回复: 14
打印 上一主题 下一主题

请问MySQL要记录达到多少的时候才开始启用索引 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-11 11:36 |只看该作者 |倒序浏览
我用:

  1. ALTER TABLE mytable ADD INDEX col1_col2_col3 (col1, col2, col3);
复制代码


创建的索引,如果表里面只有几十条记录,则索引的Cardinality显示为None,而且用:

  1. EXPLAIN  SELECT  * FROM  `mytable`  WHERE col1 = 'XX' AND col2 = 'XX' AND col3 = 'XX';
复制代码


显示possible_keys是col1_col2_col3,但key却是NULL。

如果表里面有数万条记录,则Cardinality显示为记录的个数,请问为什么会有这种区别?是不是记录较少的时候不使用索引?谢谢!

[ 本帖最后由 soichiro 于 2006-5-11 11:51 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-05-11 12:45 |只看该作者
你的3个字段分别是什么类型?

看看 http://imysql.cn/?q=node/45,希望对你有帮助。

论坛徽章:
0
3 [报告]
发表于 2006-05-11 12:55 |只看该作者

回复 2楼 yejr 的帖子

字段都是int,我就是在一个已经有数万条记录的表中做了多字段索引,而且索引是正常工作的,然后我就把表结构复制成一个新表,往新表里插了几十条记录,然后做完全相同的多字段索引,但索引却没有启用。

论坛徽章:
0
4 [报告]
发表于 2006-05-11 13:06 |只看该作者
你怎么知道索引没有启用

论坛徽章:
0
5 [报告]
发表于 2006-05-11 13:24 |只看该作者
原帖由 lizhuo 于 2006-5-11 13:06 发表
你怎么知道索引没有启用


在数万条记录的表里查询:

  1. EXPLAIN SELECT * FROM mytable WHERE col1 = 'x' and col2 = 'x';
复制代码


显示的是:
+----+-------------+------------------------+------+-------------------+-------------------+---------+-------------+------+-------------+
| id | select_type | table                  | type | possible_keys     | key               | key_len | ref         | rows | Extra       |
+----+-------------+------------------------+------+-------------------+-------------------+---------+-------------+------+-------------+
|  1 | SIMPLE      | mytable | ref  | col1_col2_col3 | col1_col2_col3 |       8 | const,const |   13 | Using where |
+----+-------------+------------------------+------+-------------------+-------------------+---------+-------------+------+-------------+

而在只有几十条记录的新表中却是:
+----+-------------+----------------------------+------+-------------------+------+---------+------+------+-------------+
| id | select_type | table                      | type | possible_keys     | key  | key_len | ref  | rows | Extra       |
+----+-------------+----------------------------+------+-------------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | mytable_new | ALL  | col1_col2_col3 | NULL |    NULL | NULL |   39 | Using where |
+----+-------------+----------------------------+------+-------------------+------+---------+------+------+-------------+

两个表的结构和索引是一模一样的。

论坛徽章:
0
6 [报告]
发表于 2006-05-11 14:16 |只看该作者
原帖由 soichiro 于 2006-5-11 12:55 发表
字段都是int,我就是在一个已经有数万条记录的表中做了多字段索引,而且索引是正常工作的,然后我就把表结构复制成一个新表,往新表里插了几十条记录,然后做完全相同的多字段索引,但索引却没有启用。


在表记录很少的情况下,不使用索引会更快的,放心吧。

http://imysql.cn/?q=node/46 这里就提到了。

论坛徽章:
0
7 [报告]
发表于 2006-05-11 14:32 |只看该作者
原帖由 yejr 于 2006-5-11 14:16 发表


在表记录很少的情况下,不使用索引会更快的,放心吧。

http://imysql.cn/?q=node/46 这里就提到了。



我最大的疑问是当我的表记录不断增长以后MySQL会不会自动启用索引?用不用索引是不是MySQL自己控制的?临界值是多少?

论坛徽章:
0
8 [报告]
发表于 2006-05-11 14:55 |只看该作者
我刚才测试了一下,发现记录数大于等于100的时候MySQL会自动启用索引,如果小于这个数则不使用索引,我由此推测这个临界值是由变量:key cache division limit来设定的,因为我的MySQL变量中只有这个值刚好为100。
谢谢诸位的提示。

论坛徽章:
0
9 [报告]
发表于 2006-05-12 09:40 |只看该作者
模糊记得这个是mysql默认的,好像不能设置,的确是有一定数量才启动索引。不知道记得对不对,还望指正

论坛徽章:
0
10 [报告]
发表于 2006-05-12 10:08 |只看该作者
原帖由 soichiro 于 2006-5-11 14:55 发表
我刚才测试了一下,发现记录数大于等于100的时候MySQL会自动启用索引,如果小于这个数则不使用索引,我由此推测这个临界值是由变量:key cache division limit来设定的,因为我的MySQL变量中只有这个值刚好为100。 ...


这部分资料我正好翻译过,详情请看
http://imysql.cn/?q=node/47
应该跟这个参数没关系。

每次查询之前,mysql都会做一下优化,在这个过程中会判断是否要使用索引。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP