单列索引和复合索引的使用
表结构:
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
单列索引和复合索引的使用相关推荐
- Pandas把dataframe的索引、复合索引变换为数据列:包含单索引到单列(重命名)、复合索引到多数据列、复合索引的其中一个水平变换为数据列、
Pandas把dataframe的索引.复合索引变换为数据列:包含单索引到单列(重命名).复合索引到多数据列.复合索引的其中一个水平变换为数据列 目录
- is NULL , is NOT NULL 有时索引失效 || in 走索引, not in 索引失效 ||单列索引和复合索引 || 查看索引使用情况
is NULL , is NOT NULL 有时索引失效 in 走索引, not in 索引失效 单列索引和复合索引 尽量使用复合索引,而少使用单列索引 数据库会选择一个最优的索引(辨识度最高索引)来 ...
- MySQL单列索引与复合索引选择
单列索引和复合索引. 尽量使用复合索引,而少使用单列索引 . 创建复合索引 create index idx_name_sta_address on tb_seller(name, status, a ...
- 索引、单列索引、复合索引、主键、唯一索引、聚簇索引、非聚簇索引、唯一聚簇索引 的区别与联系
B树与红黑树最广泛的应用就是数据库索引,熟练使用索引是程序员最重要的基本功之一.索引的数据结构可以是树,也可以是哈希表.常用的数据库都是树结构的索引,本篇的背景也全部以树结构的索引为前提.本文旨在梳理 ...
- 联合索引(复合索引)和单个索引
背景: 为了提高数据库效率,建索引是家常便饭:那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下. 一.联合索引 ...
- Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面、索引行复合索引中的一个切面
Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面.索引行复合索引中的一个切面 目录
- php复合索引,关于复合索引和单独索引的一个问题
复合索引 1,shopid ctime EXPLAIN SELECT COUNT(*) FROM dc_order_menu_log WHERE shopid = 12 AND ctime > ...
- 单一索引和复合索引区别及联系
单一索引和复合索引区别及联系 - BABY的日志 - 网易博客 http://selectgoodboy.blog.163.com/blog/static/103212061201519111711 ...
- 数据库查询索引(sql单个索引和复合索引)
数据库查询索引(sql单个索引和复合索引)http://www.bieryun.com/3380.html 当一条sql语句的查询涉及到多个字段,这个时候给每个字段加索引,数据库也只能够使用其中的一个 ...
- oracle 复合索引原则,复合索引在什么情况下使用
http://topic.csdn.net/t/20060813/16/4946416.html 1.复合索引使用的目的是什么? :能形成索引覆盖,提高where语句的查询效率 2.一个复合索引是否可 ...
最新文章
- mysql如何查看事务日记_MySQL中的几种日志了解
- php轮播代码生成器,最简单的Banner轮播左右切换效果代码及实现思路(附带源码)...
- 最短路径生成树与最小生成树
- oracle创建目录并赋权,Oracle 添加用户并赋权,修改密码,解锁,删除用户的方法...
- 雷军:电视机越大才越舒服!
- Java线程的同步 - synchronized
- MapReduce 支持的部分数据挖掘算法
- 深度学习head、neck、backbone三个术语分别是指什么?
- (转)全球3.4万亿美元ETF蓝海,我们还在末尾 且听全球第二大团队讲真经
- 车控APP发现安全隐患,研究人员模拟黑客入侵
- 浅谈大型互联网的企业入/侵及防护策略
- uniapp map画多边形 打点连线
- idea鼠标放大字体设置
- SpringMVC 之类型转换Converter详解转载
- 怒爬某破Hub站资源,只为撸这个鉴黄平台
- 人工智能期末——第二章知识的表示
- 一个人颓废的九大根源
- 联想服务器重置ipmi密码,超微主板重置IPMI密码
- R中的假设检验(四)卡方检验
- EEG脑地形图绘制程序
热门文章
- OpenCV实现在图像中写入汉字
- 【ubuntu工具】Atom的简介及安装
- 华为鸿蒙手机官网价格表,曝下半年华为将推出两款鸿蒙手机:国内独享,价格良心...
- oracle表空间更改用户,ORACLE创建表空间、创建用户、更改用户默认表空间以及授权、查看权限...
- ef core mysql 字符集,EF Core 基础知识
- python技术晨讲_python系列教程14
- npm包开发测试与发布
- 软件测试--利用正交表设计测试用例
- js上传文件,上传表单demo 包含后端php
- 离群点检测算法-基础概念