建立created_time和item_name上的联合索引对比测试

- 建立created_time和item_name字段的联合索引
create index idx_sort on t_source(created_time,item_name,item_id);  
analyze table t_source;
(1)使用相关子查询
truncate t_target;  (http://www.amjmh.com/v/BIBRGZ_558768/)
insert into t_target  
select distinct t1.* from t_source t1 where item_id in   
(select min(item_id) from t_source t2 where t1.created_time=t2.created_time and t1.item_name=t2.item_name);
        本次用时19秒,查询计划如下:

mysql> explain select distinct t1.* from t_source t1 where item_id in   
    -> (select min(item_id) from t_source t2 where t1.created_time=t2.created_time and t1.item_name=t2.item_name);  
+----+--------------------+-------+------------+------+---------------+----------+---------+----------------------------------------+--------+----------+------------------------------+
| id | select_type        | table | partitions | type | possible_keys | key      | key_len | ref                                    | rows   | filtered | Extra                        |
+----+--------------------+-------+------------+------+---------------+----------+---------+----------------------------------------+--------+----------+------------------------------+
|  1 | PRIMARY            | t1    | NULL       | ALL  | NULL          | NULL     | NULL    | NULL                                   | 997281 |   100.00 | Using where; Using temporary |
|  2 | DEPENDENT SUBQUERY | t2    | NULL       | ref  | idx_sort      | idx_sort | 89      | test.t1.created_time,test.t1.item_name |      2 |   100.00 | Using index                  |
+----+--------------------+-------+------------+------+---------------+----------+---------+----------------------------------------+--------+----------+------------------------------+
2 rows in set, 3 warnings (0.00 sec)
外层查询的t_source表是驱动表,需要扫描100万行。
对于驱动表每行的item_id,通过idx_sort索引查询出两行数据。

原文地址:https://www.cnblogs.com/hyhy904/p/11311213.html

时间: 2024-08-10 00:07:23

建立created_time和item_name上的联合索引对比测试的相关文章

【索引】联合索引的基本知识

0.预备 假设我们有表 user (id,name)列 1.联合索引是个什么东西 我们知道,对于表的单列(如id)数据,是可以建立索引的,对于多列(id和name组合,或者,name和id组合),也可以建立索引.联合索引,也称之为组合索引. 先来看单列索引的逻辑结构. 由此得出索引的三个特征:索引有序+高度较低+存储列值 联合索引也满足这三个特征,但这里的逻辑图就不画了,而是以更直观的方式来展现其查找逻辑,这里应注意,联合索引的列有前后,以id列在前.name列在后为例. 建联合索引前的情况 建

MySQL 联合索引测试

搭建测试环境 1:创建表 CREATE TABLE tab_index (id int(5), age int(3), dte datetime); 2:插入测试数据 INSERT INTO tab_index VALUES(1,'2012-05-13',23); INSERT INTO tab_index VALUES(2,'2012-05-13',23); INSERT INTO tab_index VALUES(3,'2012-05-13',31); INSERT INTO tab_ind

Mysql中联合索引的最左匹配原则(百度)

创建联合索引时列的选择原则 经常用的列优先(最左匹配原则) 离散度高的列优先(离散度高原则) 宽度小的列优先(最少空间原则) 在Mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先.如果我们建立了一个2列的联合索引(col1,col2),实际上已经建立了两个联合索引(col1).(col1,col2);如果有一个3列索引(col1,col2,col3),实际上已经建立了三个联合索引(col1).(col1,col2).(col1,col2,col3). 解释 1.b+树的数据项是复合的

表建立联合索引

表建立联合索引后,以两个字段为例,如果想查询速度快,where条件中要么带上两个字段,要么带上前面的,如果只有后面的不会变快. 实例:以下联合索引:itemid和clock 这个联合索引 如果where字段查clock的话 是不能走索引的, 所以查询会慢 . 要想查询变快的话,查itemid,或者两个一起查.

联合索引优化策略

1:索引类型 1.1 B-tree索引 注: 名叫btree索引,大的方面看,都用的平衡树,但具体的实现上, 各引擎稍有不同, 比如,严格的说,NDB引擎,使用的是T-tree Myisam,innodb中,默认用B-tree索引 但抽象一下---B-tree系统,可理解为”排好序的快速查找结构”. 1.2 hash索引 在memory表里,默认是hash索引, hash的理论查询时间复杂度为O(1) 疑问: 既然hash的查找如此高效,为什么不都用hash索引? 答: 1:hash函数计算后的

mysql联合索引详解

所有的MySQL列类型能被索引.在相关的列上的使用索引是改进SELECT操作性能的最好方法. 一.前缀索引 对于CHAR和VARCHAR列,你可以索引列的前缀.这更快并且比索引整个列需要较少的磁盘空间.在CREATE TABLE语句中索引列前缀的语法看起来像这样: KEY index_name (col_name(length))下面的例子为name列的头10个字符创建一个索引: mysql> CREATE TABLE test (name CHAR(200) NOT NULL,KEY inde

mysql 什么时候用单列索引?什么使用用联合索引?

我一个表 students 表,有3个字段 ,id,name,age 我要查询 通过 name 和age,在这两个字段 是创建 联合索引?还是分别在nage和age上创建 单列索引呢? 多个字段查询什么情况下用联合索引 什么时候分别创建单列索引呢? 作者:范孝鹏链接:https://www.zhihu.com/question/40736083/answer/88191544来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1,首先要确定优化的目标,在什么样的业务场

mysql 联合索引详解

mysql 联合索引详解   联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效. 两个或更多个列上的索引被称作复合索引.利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引.复合索引的结构与电话簿类似,人名由

mysql 联合索引和唯一索引

一般来说.如果有where a=? and b=? and c=? 的语句. 如果表也有DML, 我一般只在a 上建索引.  这也是代价平衡的结果. 一方面 只在a 上建索引那么是 index range scan, 不像联合索引那样可以index  unique scan , 我觉得速度差的不多(数据量不大的情况). 另一方面,DML也会更新index,更新三个column肯定比更新一个column慢些. 所以我一般采取折中.只建单列或2列索引. 联合索引对于查询 where a=? and