H5W3
当前位置:H5W3 > mysql > 正文

【mysql】MySQL 的查询条件要用到的字段是否需要建立索引?

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因重复值太多,即使建立索引,数据库系统仍然会采用全表扫描的方式读取数据

同意@地狱星星的看法。补充一点,对于这种情况,一是需要你检视一下自己的数据库表结构设计的是否合理;二是对于类似的需求,看是否能够将其转化为主键或有效索引项的查询。

是的,如果你的STATUS字段值是个状态值的话,是走全表扫描的,索引的建立是在distinct column很大的基础上,不知道status字段类型是否是enum,这样的话更好了

本文地址:H5W3 » 【mysql】MySQL 的查询条件要用到的字段是否需要建立索引?

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址