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
是作为查询条件的,但是如果它的值大部分都是重复的,那么实际上索引起不到什么作用,反而还耽误载入索引的时间,不知道我的想法是否正确?
user_id需要建立索引
status因重复值太多,即使建立索引,数据库系统仍然会采用全表扫描的方式读取数据