MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
index_merge_intersect_dml.inc
1 #
2 # index_merge tests for statements using intersect algorithm
3 #
4 
5 --disable_warnings
6 DROP TABLE IF EXISTS t1,t2;
7 --enable_warnings
8 
9 CREATE TABLE t1 (
10  pk MEDIUMINT NOT NULL AUTO_INCREMENT,
11  a INT NOT NULL,
12  b INT NOT NULL,
13  c INT NOT NULL,
14  d INT NOT NULL,
15  PRIMARY KEY pk (pk),
16  KEY idx_a (a),
17  KEY idx_b (b),
18  KEY idx_c (c),
19  KEY idx_d (d)
20 );
21 
22 --disable_query_log
23 
24 # Inserting a lot of rows inorder to enable index_merge intersect
25 
26 INSERT INTO t1(a,b,c,d) VALUES
27  ( RAND()*5, RAND()*5, RAND()*5, RAND()*5 );
28 
29 let $cnt=4;
30 while ($cnt)
31 {
32  INSERT INTO t1(a,b,c,d) SELECT 6,6,6,6 FROM t1;
33  dec $cnt;
34 }
35 
36 INSERT INTO t1(a,b,c,d) SELECT 6, RAND()*5, RAND()*5,
37  RAND()*5 FROM t1 LIMIT 3;
38 INSERT INTO t1(a,b,c,d) SELECT RAND()*5, 6, RAND()*5,
39  RAND()*5 FROM t1 LIMIT 3;
40 INSERT INTO t1(a,b,c,d) SELECT RAND()*5, RAND()*5, 6,
41  RAND()*5 FROM t1 LIMIT 3;
42 INSERT INTO t1(a,b,c,d) SELECT RAND()*5, RAND()*5,
43  RAND()*5, 6 FROM t1 LIMIT 3;
44 
45 let $cnt=7;
46 while ($cnt)
47 {
48  INSERT INTO t1(a,b,c,d) SELECT RAND()*5, RAND()*5,
49  RAND()*5, RAND()*5 FROM t1;
50  dec $cnt;
51 }
52 
53 --enable_query_log
54 
55 # The following statement analyzes and
56 # stores the key distribution for a table.
57 
58 ANALYZE TABLE t1;
59 
60 # DELETEs are not included as index merge intersection
61 # is disabled for DELETE statements.
62 
63 # 1. UPDATE
64 
65 --let $query = WHERE b=6 AND c=6
66 --replace_result "idx_c,idx_b" "idx_b,idx_c"
67 --replace_column 9 #
68 --eval EXPLAIN UPDATE t1 SET a=2 $query
69 --eval SELECT COUNT(*), SUM(a) FROM t1 $query
70 --eval UPDATE t1 SET a=2 $query
71 --eval SELECT COUNT(*), SUM(a) FROM t1 $query
72 
73 --let $query = WHERE b=6 AND c=6 AND d=6
74 --replace_result idx_b idx_x idx_c idx_x idx_d idx_x
75 --replace_column 9 #
76 --eval EXPLAIN UPDATE t1 SET a=2 $query
77 --eval SELECT COUNT(*), SUM(a) FROM t1 $query
78 --eval UPDATE t1 SET a=2 $query
79 --eval SELECT COUNT(*), SUM(a) FROM t1 $query
80 
81 --let $query = WHERE d=6 AND a IS NOT NULL AND b=6
82 --replace_result "idx_d,idx_b" "idx_b,idx_d"
83 --replace_column 9 #
84 --eval EXPLAIN UPDATE t1 SET c=6 $query
85 --eval SELECT COUNT(*), SUM(c) FROM t1 $query
86 --eval UPDATE t1 SET c=6 $query
87 --eval SELECT COUNT(*), SUM(c) FROM t1 $query
88 
89 --let $query = WHERE d=6 AND a=6 AND c <> 6
90 --replace_column 9 #
91 --eval EXPLAIN UPDATE t1 SET b=0 $query
92 --eval SELECT COUNT(*), SUM(b) FROM t1 $query
93 --eval UPDATE t1 SET b=0 $query
94 --eval SELECT COUNT(*), SUM(b) FROM t1 $query
95 
96 --let $query = WHERE d=6 AND a=6 AND c IN (1,2,3,4,5)
97 --replace_column 9 #
98 --eval EXPLAIN UPDATE t1 SET a=100 $query
99 --eval SELECT COUNT(*), SUM(a) FROM t1 $query
100 --eval UPDATE t1 SET a=100 $query
101 --eval SELECT COUNT(*), SUM(a) FROM t1 $query
102 
103 # uses range scan instead of index_merge
104 
105 --let $query = WHERE a=5 AND b=4 AND d<3
106 --replace_column 9 #
107 --eval EXPLAIN UPDATE t1 SET a=2 $query
108 --eval UPDATE t1 SET a=2 $query
109 
110 # Any range condition over a primary key of an InnoDB table.
111 
112 create table t2 (
113  pk MEDIUMINT NOT NULL AUTO_INCREMENT,
114  a INT NOT NULL,
115  b INT NOT NULL,
116  c INT NOT NULL,
117  d INT NOT NULL,
118  PRIMARY KEY pk (pk),
119  KEY idx_a (a),
120  KEY idx_b (b),
121  KEY idx_c (c),
122  KEY idx_d (d)
123 )engine=InnoDB;
124 
125 INSERT INTO t2 SELECT * FROM t1;
126 ANALYZE TABLE t2;
127 
128 --let $query = WHERE pk<2492 AND d=1
129 --replace_column 9 #
130 --eval EXPLAIN UPDATE t2 SET a=2 $query
131 --eval UPDATE t2 SET a=2 $query
132 
133 # 2. REPLACE and INSERT
134 
135 CREATE TABLE t3(
136  a INT NOT NULL,
137  b INT NOT NULL,
138  c INT NOT NULL,
139  d INT NOT NULL,
140  e INT
141 );
142 
143 INSERT INTO t3(a,b,c,d,e) VALUES (3890,3890,3890,3890,3890);
144 INSERT INTO t3(a,b,c,d,e) VALUES (4000,4000,4000,4000,4000);
145 
146 --let $query = INTO t3 SELECT * FROM t1 WHERE b=6 AND c=6
147 --replace_result "idx_c,idx_b" "idx_b,idx_c"
148 --replace_column 9 #
149 --eval EXPLAIN REPLACE $query
150 --eval SELECT COUNT(*) FROM t3
151 --eval REPLACE $query
152 --eval SELECT COUNT(*) FROM t3
153 
154 --let $query = INTO t3 SELECT * FROM t1 WHERE d=6 AND a IS NOT NULL AND b=6
155 --replace_column 9 #
156 --replace_result "idx_d,idx_b" "idx_b,idx_d"
157 --eval EXPLAIN INSERT $query
158 --eval SELECT COUNT(*) FROM t3
159 --eval INSERT $query
160 --eval SELECT COUNT(*) FROM t3
161 
162 # Test case for multi column set-up.
163 
164 CREATE TABLE t4 (
165  pk MEDIUMINT NOT NULL AUTO_INCREMENT,
166  a INT NOT NULL,
167  b INT NOT NULL,
168  c INT NOT NULL,
169  d INT NOT NULL,
170  PRIMARY KEY pk (pk),
171  KEY idx_cd (c,d),
172  KEY idx_bd (b,d)
173 );
174 
175 INSERT INTO t4 SELECT * FROM t1;
176 
177 # The following statement analyzes and
178 # stores the key distribution for a table.
179 
180 ANALYZE TABLE t4;
181 
182 --let $query = WHERE b=6 AND c=6 AND d=6
183 --replace_result idx_b idx_x idx_c idx_x idx_d idx_x
184 --replace_column 9 #
185 --eval EXPLAIN UPDATE t4 SET a=2 $query
186 --eval SELECT COUNT(*), SUM(a) FROM t4 $query
187 --eval UPDATE t4 SET a=2 $query
188 --eval SELECT COUNT(*), SUM(a) FROM t4 $query
189 
190 DROP TABLE t1,t2,t3,t4;
191 
192 #
193 # end of test cases for intersect index_merge optimization technique
194 #
195 
196 
197