复合索引,排第一的效果

mysql> select count(*) from tf_user_index where  age = 30;
+----------+
| count(*) |
+----------+
|   196477 |
+----------+
1 row in set (1.66 sec)

mysql> select count(*) from tf_user_index where  score = 30;
+----------+
| count(*) |
+----------+
|   126306 |
+----------+
1 row in set (0.03 sec)

mysql> explain select count(*) from tf_user_index where  age = 30;
+----+-------------+---------------+-------+---------------+---------------+---------+------+---------+--------------------------+
| id | select_type | table         | type  | possible_keys | key           | key_len | ref  | rows    | Extra                    |
+----+-------------+---------------+-------+---------------+---------------+---------+------+---------+--------------------------+
|  1 | SIMPLE      | tf_user_index | index | NULL          | score_sex_age | 6       | NULL | 8962455 | Using where; Using index |
+----+-------------+---------------+-------+---------------+---------------+---------+------+---------+--------------------------+
1 row in set (0.00 sec)

mysql> explain select count(*) from tf_user_index where  score = 30;
+----+-------------+---------------+------+---------------+---------------+---------+-------+--------+-------------+
| id | select_type | table         | type | possible_keys | key           | key_len | ref   | rows   | Extra       |
+----+-------------+---------------+------+---------------+---------------+---------+-------+--------+-------------+
|  1 | SIMPLE      | tf_user_index | ref  | score_sex_age | score_sex_age | 4       | const | 241442 | Using index |
+----+-------------+---------------+------+---------------+---------------+---------+-------+--------+-------------+
1 row in set (0.01 sec)

score排第一,查询时间很快。age排第三,查询要1秒多时间。

mysql> select count(*) from tf_user where  score = 30;
+----------+
| count(*) |
+----------+
|   126306 |
+----------+
1 row in set (3.37 sec)

mysql> select count(*) from tf_user where  age = 30;
+----------+
| count(*) |
+----------+
|   196477 |
+----------+
1 row in set (2.44 sec)

没有复合索引,都需要好几秒时间。复合索引有一定的效果,但是单独查询时,对排第一的更有效。

调换一下顺序,现在将age排第一。

mysql> select count(*) from tf_user_index where  age = 30;
+----------+
| count(*) |
+----------+
|   196477 |
+----------+
1 row in set (0.05 sec)

mysql> select count(*) from tf_user_index where  score = 30;
+----------+
| count(*) |
+----------+
|   126306 |
+----------+
1 row in set (1.82 sec)

mysql> explain select count(*) from tf_user_index where  score = 30;
+----+-------------+---------------+-------+---------------+---------------+---------+------+---------+--------------------------+
| id | select_type | table         | type  | possible_keys | key           | key_len | ref  | rows    | Extra                    |
+----+-------------+---------------+-------+---------------+---------------+---------+------+---------+--------------------------+
|  1 | SIMPLE      | tf_user_index | index | NULL          | age_score_sex | 6       | NULL | 8962455 | Using where; Using index |
+----+-------------+---------------+-------+---------------+---------------+---------+------+---------+--------------------------+
1 row in set (0.00 sec)

mysql> explain select count(*) from tf_user_index where  age = 30;
+----+-------------+---------------+------+---------------+---------------+---------+-------+--------+-------------+
| id | select_type | table         | type | possible_keys | key           | key_len | ref   | rows   | Extra       |
+----+-------------+---------------+------+---------------+---------------+---------+-------+--------+-------------+
|  1 | SIMPLE      | tf_user_index | ref  | age_score_sex | age_score_sex | 1       | const | 408456 | Using index |
+----+-------------+---------------+------+---------------+---------------+---------+-------+--------+-------------+
1 row in set (0.00 sec)

排第一很重要。

mysql> explain select count(*) from tf_user_index where  age = 30 and score =30;
+----+-------------+---------------+------+---------------+---------------+---------+-------------+------+-------------+
| id | select_type | table         | type | possible_keys | key           | key_len | ref         | rows | Extra       |
+----+-------------+---------------+------+---------------+---------------+---------+-------------+------+-------------+
|  1 | SIMPLE      | tf_user_index | ref  | age_score_sex | age_score_sex | 5       | const,const | 2467 | Using index |
+----+-------------+---------------+------+---------------+---------------+---------+-------------+------+-------------+
1 row in set (0.00 sec)

mysql> select count(*) from tf_user_index where  age = 30 and score =30;
+----------+
| count(*) |
+----------+
|     2468 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from tf_user_index where  score =30 and age = 30;
+----------+
| count(*) |
+----------+
|     2468 |
+----------+
1 row in set (0.01 sec)

mysql> select count(*) from tf_user_index where  score =30 and sex = 2;
+----------+
| count(*) |
+----------+
|    63031 |
+----------+
1 row in set (2.06 sec)

只要带到age,查询就很快。

联合索引中,第一个位置很重要。

原文地址:https://www.cnblogs.com/jiqing9006/p/10137051.html

时间: 2024-10-07 18:52:19

复合索引,排第一的效果的相关文章

oracle复合索引的选择和使用

声明:虽然题目是Oracle.但同样适合MySQL InnoDB索引          在大多数情况下.复合索引比单字段索引好     很多系统就是靠新建一些合适的复合索引.使效率大幅度提高     复合索引比单字段索引复杂.有两个原则需把握:前缀性和可选性     但是.可叹的是.国内很多IT系统开发人员没有意识到应该优先设计复合索引     更没有充分理解复合索引的前缀性和可选性这两个重要原则          ㈠ 前缀性(Prefixing)                  在谓词条件中

Oracle 复合索引设计原理——前缀性和可选性

前缀性: 复合索引的前缀性是指只有当复合索引的第一个字段出现在SQL语句的谓词条件中时,该索引才会被用到.如复合索引为(ename,job,mgr),只要谓词条件中出现第一个字段ename,就可以用复合索引,否则不会用.唯一的例外是skip scan index,就是如果Oracle发现第一个字段的值很少,会自动拆分为两个复合索引.如复合索引(gender,ename,job,mgr),因为第一个字段gender只有两个值:男和女,因此Oracle会将这个索引拆分成('男',ename,job,

复合索引介绍

什么是复合索引 1.1           复合索引定义 索引可以包含一个.两个或更多个列.两个或更多个列上的索引被称作复合索引. 利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引.复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序.如果您知道姓,电话簿将非常有用:如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处. 所以说创建复合索引时,应该仔细考虑列的顺序.对索引中的所

mysql复合索引、普通索引总结

对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效.下面用几个例子对比查询条件的不同对性能影响. create table test(a int,b int,c int,KEY a(a,b,c)); 优: select * from test where a=10 and

SQL Server的复合索引学习【转载】

概要什么是单一索引,什么又是复合索引呢? 何时新建复合索引,复合索引又需要注意些什么呢?本篇文章主要是对网上一些讨论的总结. 一.概念 单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上. 用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引).复合索引的创建方法与创建单一索引的方法完全一样.但复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引.当表的行数远远大于索引键的数目时,使用这种方式可以明显加快表的查询速度. 同时有两个概念叫做窄索引和宽索引,窄索引是指索引列

MySQL 复合索引

一. 1.索引越少越好,在修改数据时,第个索引都要进行更新,降低写速度.2.最窄的字段放在键的左边3.避免file sort排序,临时表和表扫描. 二.复合索引的建立原则: 如果您很可能仅对一个列多次执行搜索,则该列应该是复合索引中的第一列.如果您很可能对一个两列索引中的两个列执行单独的搜索,则应该创建另一个仅包含第二列的索引.如上图所示,如果查询中需要对年龄和性别做查询,则应当再新建一个包含年龄和性别的复合索引.包含多个列的主键始终会自动以复合索引的形式创建索引,其列的顺序是它们在表定义中出现

复合索引,覆盖索引,书签查找(键查找)

今天一位小伙伴问我关于SQL查询效率以及索引的东西. 我说只要尽量命中索引即可.特别是聚集索引.思前想后,好像总有什么不对! 于是又做了一番资料查询,发现索引不是那么简单,即使是命中索引也是没那么简单. 突然有些感慨,当个DBA不容易啊. 1.复合索引 先说说复合索引,相信大家都知道.两个或更多列上的索引就被称作复合索引. 最近在做某酒店的项目.拿这个举个例子: Order表名, 其中包含列:GuestSrcCode(客源代码),HotelID(酒店编号) tips:客源代码只有几种情况(散客,

复合索引(转载http://www.cnblogs.com/wenly/articles/1240321.html)

复合索引 概要什么是单一索引,什么又是复合索引呢? 何时新建复合索引,复合索引又需要注意些什么呢?本篇文章主要是对网上一些讨论的总结. 一.概念 单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上. 用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引).复合索引的创建方法与创建单一索引的方法完全一样.但复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引.当表的行数远远大于索引键的数目时,使用这种方式可以明显加快表的查询速度. 同时有两个概念叫做窄索引和宽索引,窄索引

MySQL创建复合索引

在MySQL数据库中,创建复合索引的时候,不知道在创建过程中哪个列在前面,哪个列该在后面,用以下方式即可: select count(distinct first_name)/count(*) as first_name_selectivity,count(distinct last_name)/count(*) as last_name_selectivity,count(*)from actor\G mysql> select count(distinct first_name)/count