表结构:

mysql> desc car;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(3)      | NO   | PRI | NULL    | auto_increment |
| brand    | varchar(16) | YES  | MUL | NULL    |                |
| name     | varchar(30) | YES  | MUL | NULL    |                |
| emission | varchar(6)  | YES  | MUL | NULL    |                |
| country  | varchar(4)  | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

索引:

mysql> show index from car;
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| car   |          0 | PRIMARY     |            1 | id          | A         |          39 |     NULL | NULL   |      | BTREE      |         |               |
| car   |          1 | IX_brand    |            1 | brand       | A         |           4 |     NULL | NULL   | YES  | BTREE      |         |               |
| car   |          1 | IX_name     |            1 | name        | A         |          39 |     NULL | NULL   | YES  | BTREE      |         |               |
| car   |          1 | IX_emission |            1 | emission    | A         |          39 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)

三个字段的单列索引。

数据:

mysql> SELECT * FROM car;
+----+--------+-----------+----------+---------+
| id | brand  | name      | emission | country |
+----+--------+-----------+----------+---------+
|  1 | 大众   | 捷达      | 1.6L     | 德系    |
|  2 | 大众   | 桑塔纳    | 1.6L     | 德系    |
|  3 | 大众   | 桑塔纳    | 1.8L     | 德系    |
|  4 | 大众   | 桑塔纳    | 2.0L     | 德系    |
|  5 | 斯柯达 | 晶锐      | 1.6L     | 德系    |
|  6 | 斯柯达 | 晶锐      | 1.4L     | 德系    |
|  7 | 大众   | POLO      | 1.4L     | 德系    |
|  8 | 大众   | POLO      | 1.6L     | 德系    |
|  9 | 大众   | 新宝来    | 1.L      | 德系    |
| 10 | 大众   | 新宝来    | 1.6L     | 德系    |
| 11 | 大众   | 新宝来    | 1.4TSI   | 德系    |
| 12 | 大众   | 新速腾    | 1.4TSI   | 德系    |
| 13 | 大众   | 新速腾    | 1.6L     | 德系    |
| 14 | 大众   | 新速腾    | 1.8TSI   | 德系    |
| 15 | 大众   | 高尔夫GTI | 2.0TSI   | 德系    |
| 16 | 大众   | 高尔夫    | 1.6L     | 德系    |
| 17 | 大众   | 高尔夫    | 1.4TSI   | 德系    |
| 18 | 大众   | 朗逸      | 1.6L     | 德系    |
| 19 | 大众   | 朗逸      | 2.0L     | 德系    |
| 20 | 大众   | 朗逸      | 1.4TSI   | 德系    |
| 21 | 大众   | 帕萨特    | 1.8TSI   | 德系    |
| 22 | 大众   | 帕萨特    | 2.0L     | 德系    |
| 23 | 大众   | 帕萨特    | 2.8L     | 德系    |
| 24 | 大众   | 迈腾      | 1.8TSI   | 德系    |
| 25 | 大众   | 迈腾      | 1.4TSI   | 德系    |
| 26 | 大众   | 迈腾      | 2.0TSI   | 德系    |
| 27 | 斯柯达 | 明锐      | 2.0L     | 德系    |
| 28 | 斯柯达 | 明锐      | 1.6L     | 德系    |
| 29 | 斯柯达 | 明锐      | 1.4TSI   | 德系    |
| 30 | 斯柯达 | 明锐      | 1.8TSI   | 德系    |
| 31 | 大众   | 途观      | 1.8TSI   | 德系    |
| 32 | 大众   | 途观      | 1.4TSI   | 德系    |
| 33 | 大众   | 途观      | 2.0TSI   | 德系    |
| 34 | 斯柯达 | 昊锐      | 1.8TSI   | 德系    |
| 35 | 斯柯达 | 昊锐      | 2.0TSI   | 德系    |
| 36 | 斯柯达 | 昊锐      | 1.4TSI   | 德系    |
| 37 | 大众   | 辉腾      | 3.6L     | 德系    |
| 38 | 大众   | 辉腾      | 4.2L     | 德系    |
| 39 | 大众   | 辉腾      | 6.0L     | 德系    |
+----+--------+-----------+----------+---------+
39 rows in set (0.00 sec)

====================================================================

测试1:

mysql> explain SELECT * FROM car WHERE brand='大众' AND NAME='新速腾' ORDER BY emission DESC;
+----+-------------+-------+------+------------------+---------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys    | key     | key_len | ref   | rows | Extra                       |
+----+-------------+-------+------+------------------+---------+---------+-------+------+-----------------------------+
|  1 | SIMPLE      | car   | ref  | IX_brand,IX_name | IX_name | 63      | const |    3 | Using where; Using filesort |
+----+-------------+-------+------+------------------+---------+---------+-------+------+-----------------------------+
1 row in set (0.00 sec)

虽然存在3个索引,但MYSQL只能使用一个索引,那个它认为最有效率的。

mysql> SELECT * FROM car WHERE brand='大众' AND NAME='新速腾' ORDER BY emission DESC;        
+----+-------+--------+----------+---------+
| id | brand | name   | emission | country |
+----+-------+--------+----------+---------+
| 14 | 大众  | 新速腾 | 1.8TSI   | 德系    |
| 13 | 大众  | 新速腾 | 1.6L     | 德系    |
| 12 | 大众  | 新速腾 | 1.4TSI   | 德系    |
+----+-------+--------+----------+---------+
3 rows in set (0.00 sec)

====================================================================

测试2:

复合索引(brand,name,emission)

mysql> show index from car;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| car   |          0 | PRIMARY  |            1 | id          | A         |          39 |     NULL | NULL   |      | BTREE      |         |               |
| car   |          1 | IX_b_n_e |            1 | brand       | A         |          39 |     NULL | NULL   | YES  | BTREE      |         |               |
| car   |          1 | IX_b_n_e |            2 | name        | A         |          39 |     NULL | NULL   | YES  | BTREE      |         |               |
| car   |          1 | IX_b_n_e |            3 | emission    | A         |          39 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)

mysql> explain SELECT * FROM car WHERE brand='大众' AND NAME='新速腾' ORDER BY emission DESC;
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-------------+
| id | select_type | table | type | possible_keys | key      | key_len | ref         | rows | Extra       |
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-------------+
|  1 | SIMPLE      | car   | ref  | IX_b_n_e      | IX_b_n_e | 98      | const,const |    3 | Using where |
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-------------+
1 row in set (0.00 sec)

用上索引。

====================================================================

测试3:

mysql> explain SELECT * FROM car WHERE NAME='新速腾' ORDER BY emission DESC;                        
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                       |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------+
|  1 | SIMPLE      | car   | ALL  | NULL          | NULL | NULL    | NULL |   39 | Using where; Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------+
1 row in set (0.00 sec)

如果复合索引第一个字段没有用上,那么就不会使用到索引。

====================================================================

测试4:name和brand字段互换位置

mysql> explain SELECT * FROM car WHERE NAME='新速腾' and brand='大众' ORDER BY emission DESC;        
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-------------+
| id | select_type | table | type | possible_keys | key      | key_len | ref         | rows | Extra       |
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-------------+
|  1 | SIMPLE      | car   | ref  | IX_b_n_e      | IX_b_n_e | 98      | const,const |    3 | Using where |
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-------------+
1 row in set (0.00 sec)

虽然字段的顺序和索引不一致,但因为在过滤条件上使用了3个索引的字段,索引还是可以用上索引。

====================================================================

测试5:

mysql> explain SELECT * FROM car WHERE brand='斯柯达' ORDER BY emission;
+----+-------------+-------+------+---------------+----------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key      | key_len | ref   | rows | Extra                       |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-----------------------------+
|  1 | SIMPLE      | car   | ref  | IX_b_n_e      | IX_b_n_e | 35      | const |    9 | Using where; Using filesort |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-----------------------------+
1 row in set (0.00 sec)

字段的顺序和索引不一致,不能用到索引。因为只使用了2个索引的字段。

改成字段的顺序和索引的顺序一致,就可以用到索引了。

mysql> explain SELECT * FROM car WHERE brand='斯柯达' ORDER BY name;                 
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key      | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
|  1 | SIMPLE      | car   | ref  | IX_b_n_e      | IX_b_n_e | 35      | const |    9 | Using where |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
1 row in set (0.00 sec)

====================================================================

测试6:

mysql> explain SELECT * FROM car WHERE brand='大众' and name > '' ORDER BY emission DESC;
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                       |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------+
|  1 | SIMPLE      | car   | ALL  | IX_b_n_e      | NULL | NULL    | NULL |   39 | Using where; Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------+
1 row in set (0.00 sec)

虽然是复合索引,虽然字段的顺序和索引的顺序一致,但name > '',检索的记录要大约实际表记录的20%,那么优化器就不会用到索引,而是全部扫描。

本文转自 liang3391 51CTO博客,原文链接:http://blog.51cto.com/liang3391/830622

单列索引和复合索引的使用相关推荐

  1. Pandas把dataframe的索引、复合索引变换为数据列:包含单索引到单列(重命名)、复合索引到多数据列、复合索引的其中一个水平变换为数据列、

    Pandas把dataframe的索引.复合索引变换为数据列:包含单索引到单列(重命名).复合索引到多数据列.复合索引的其中一个水平变换为数据列 目录

  2. is NULL , is NOT NULL 有时索引失效 || in 走索引, not in 索引失效 ||单列索引和复合索引 || 查看索引使用情况

    is NULL , is NOT NULL 有时索引失效 in 走索引, not in 索引失效 单列索引和复合索引 尽量使用复合索引,而少使用单列索引 数据库会选择一个最优的索引(辨识度最高索引)来 ...

  3. MySQL单列索引与复合索引选择

    单列索引和复合索引. 尽量使用复合索引,而少使用单列索引 . 创建复合索引 create index idx_name_sta_address on tb_seller(name, status, a ...

  4. 索引、单列索引、复合索引、主键、唯一索引、聚簇索引、非聚簇索引、唯一聚簇索引 的区别与联系

    B树与红黑树最广泛的应用就是数据库索引,熟练使用索引是程序员最重要的基本功之一.索引的数据结构可以是树,也可以是哈希表.常用的数据库都是树结构的索引,本篇的背景也全部以树结构的索引为前提.本文旨在梳理 ...

  5. 联合索引(复合索引)和单个索引

    背景:  为了提高数据库效率,建索引是家常便饭:那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下. 一.联合索引 ...

  6. Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面、索引行复合索引中的一个切面

    Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面.索引行复合索引中的一个切面 目录

  7. php复合索引,关于复合索引和单独索引的一个问题

    复合索引 1,shopid ctime EXPLAIN SELECT COUNT(*) FROM dc_order_menu_log WHERE shopid = 12 AND ctime > ...

  8. 单一索引和复合索引区别及联系

    单一索引和复合索引区别及联系 - BABY的日志 - 网易博客  http://selectgoodboy.blog.163.com/blog/static/103212061201519111711 ...

  9. 数据库查询索引(sql单个索引和复合索引)

    数据库查询索引(sql单个索引和复合索引)http://www.bieryun.com/3380.html 当一条sql语句的查询涉及到多个字段,这个时候给每个字段加索引,数据库也只能够使用其中的一个 ...

  10. oracle 复合索引原则,复合索引在什么情况下使用

    http://topic.csdn.net/t/20060813/16/4946416.html 1.复合索引使用的目的是什么? :能形成索引覆盖,提高where语句的查询效率 2.一个复合索引是否可 ...

最新文章

  1. 领导让我重构代码_领导不是由代码构成
  2. ArrayList集合为什么不能使用foreach增删改
  3. 50万高奖金!2022年第一场赛事来了
  4. 根据一个大图片自动生成相应小图片的代码
  5. 存储过程mysql报错1271_mysqldump备份失败以及解决方法汇总
  6. 论文浅尝 - ICLR2021 | BERTology 遇上生物学:在蛋白质语言模型中解释注意力
  7. Navicat for MySQL 使用SSH方式链接远程数据库
  8. 求大素数 - 埃拉托斯特尼筛法
  9. VCL组件之Name属性
  10. 性能为王:选择模拟监控的10大理由!
  11. 过滤器如何配置(javax.servlet.Filter)?
  12. 关于PC机相关系统的远程桌面协作的相关介绍和配置(转帖整理)
  13. 屏幕控制实现消息发送以及轰炸
  14. 5 行 Python 代码就能让你的电脑永不息屏!
  15. 有关winRAR32相关问题
  16. 【规划】常用算法大汇总
  17. python爬取当当网商品评论
  18. 黑金花大理石_黑色是百搭更是经典 — 黑金花大理石简介及案例欣赏
  19. 读博的选择,读博,还是不读博?
  20. 如何使用Spring Boot促进java开发?高级java架构师为您详解!

热门文章

  1. 【Ubuntu】ping: unknown host www.baidu.com
  2. mysql update时数据不存在新增_mysql sql语句新增判断,存在修改,不存在新增
  3. pygame做的著名游戏_用python写游戏之2D跑酷游戏(一)
  4. 所有表单对象_Laravel 表单方法伪造与 CSRF 攻击防护
  5. Java项目:前台预定+后台管理酒店管理系统(java+SSM+jsp+mysql+maven)
  6. c++窗口管理系统是什么_优秀的食堂管理系统让你对校园生活更充满希望
  7. 华为js面试题_四面腾讯与华为,大厂前端面试真BT!
  8. 整型数组负数放左面,其他放右面,要求时空复杂度:O(n), O(1)。
  9. uniapph5配置index.html模板路径不生效解决办法
  10. 小程序云开发数据库在网站读取