今天优化MYSQL的几个表,发现几个问题请教下高手。

xinzaibing 发布于 2012/07/16 12:04
阅读 448
收藏 2

1.表结构如下:

 

其中 equipid和signalid是主键,然后我执行两个查询:

会发现第一个查询语句只用了equipid过滤条件进行过滤,使用explain extended查看查询信息,发现竟然没有用到索引。

而第二个语句用了两个主键的字段进行过滤,就出现了使用主键索引的情况。

再看看下面这个图:

单的一个查询,没有任何过滤条件,也是没有使用任何索引的。

我的问题是:假设一个主键有两个字段或者更多,而查询的时候只用了其中一个或者几个?在速度上有多大的影响?

第二,在没有过滤条件的情况下,也没有用到索引,查询的时候就是全表扫描?

加载中
0
红薯
红薯
MySQL 5.5 中的复合主键的确是如此,所以我一般会单独再给它们建索引。
0
hulubo
hulubo

1、不知道mysql有没有前缀索引的概念。

2、select * from tab;

这样的语句基本上都是全表扫描了,强制用索引效率可能还更慢。

xinzaibing
xinzaibing
非常感谢!
0
我不说话
我不说话

大量数据前提下,有索引和没索引在速度上,应该是天壤之别!有索引,绝对很快。你可以做个几百W或更多试一试。

xinzaibing
xinzaibing
其实我的意思是既然在表中建了复合主键后,采用复合主键中的单个或某几个字段查询,还是有可能用到主键索引的,按目前来看,主键索引只有在对所有字段都加入过滤条件后才生效
0
deleted
deleted

给a+b+c做联合索引

适用于

where a 

where a,b

where a,b,c

不适用于

where b

where b,c

where c

0
游侠
游侠
如果你的索引是  key( equipid,signalid), where 条件为 equipid=? 是可以使用索引的,而 where 条件 signalid=? 是不会使用索引,也就是说如果你是复合索引仅会使用“最左前缀”,mysql的innodb和myisam(?)会遵循这个原则,其他存储引擎不太清楚。
xinzaibing
xinzaibing
回复 @游侠 : memory可以用BTREE索引,我把主键索引改成了BTREE索引,确实有前缀索引顺序,在where 条件下需要把第一个字段放在第一个位置,就可以使用了。 非常感谢!
游侠
游侠
回复 @xinzaibing : memory的引擎不遵循索引的最左前缀,你可以看到Index_type 为HASH, 而使用最左前缀的Index_type都是BTREE。所以说,如果 where EQUIPID=? 要使用索引,你必须单独再创建这个字段的索引。
xinzaibing
xinzaibing
回复 @游侠 : 不在公司,warning现在没法看。 存储引擎是Memory
游侠
游侠
还有第一条查询有个warning,看看是什么
游侠
游侠
回复 @xinzaibing : 再问一句,存储引擎是什么。
下一页
0
夜雨星空
夜雨星空

最好不要使用*

加复合索引啊

0
侯林宏
侯林宏

查询字段属性进最好使用字段名。不要使用*号查。如果数据很多就会速度很慢的局面。

xinzaibing
xinzaibing
回复 @侯林宏 : ..我的意思是说现在是测试索引的问题...不是测试select *还是select +表字段问题
侯林宏
侯林宏
什么是真实环境不用出现此情况。那就是运行查询数据的速度也是一样快么。
xinzaibing
xinzaibing
这个只是测试索引时方便。真实环境应用不会出现这种情况
返回顶部
顶部