Mysql的排序字段要建立索引,我想这连初学者都知道。但是我想知道的是在下面这两种情况下对索引建立是否有一定的标准。假如我建立一个这样的post表
mysql> DESC post; | |||||
---|---|---|---|---|---|
Field | Type | Null | Key | Default | Extra |
id | int(11) unsigned | NO | PRI | NULL | auto_increment |
user_id | int(11) | YES | 0 | ||
status | tinyint(4) | YES | 0 | ||
text | text | YES | NULL |
4 rows in set (0.00 sec)
如果我要按user_id来查询
mysql> SELECT * FROM post WHERE user_id = 123; | |||
---|---|---|---|
id | user_id | status | text |
1 | 123 | 1 | asdfasdfasdfsdf |
3 | 123 | 1 | dddddd |
2 rows in set (0.00 sec)
或者我要按status来查询
mysql> SELECT * FROM post WHERE status = 0; | |||
---|---|---|---|
id | user_id | status | text |
2 | 243 | 0 | 23423zxcv2323234 |
4 | 567 | 0 | xcvq3453q4534 |
2 rows in set (0.00 sec)
这两种查询在语句上看来没有任何区别,但是业务需求上是有很大区别的,user_id是一个外键字段,它的值是很分散的。而status是一个状态字段,它就集中在几个数字上,可能大部分还是某一个数字。对这两种查询如果做索引需要怎么考虑呢?我想的是虽然status是作为查询条件的,但是如果它的值大部分都是重复的,那么实际上索引起不到什么作用,反而还耽误载入索引的时间,不知道我的想法是否正确?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
是的,如果你的STATUS字段值是个状态值的话,是走全表扫描的,索引的建立是在distinct column很大的基础上,不知道status字段类型是否是enum,这样的话更好了