mirror of
https://github.com/MariaDB/server.git
synced 2025-02-14 17:35:35 +01:00
![Monty](/assets/img/avatar_default.png)
This includes all test changes from "Changing all cost calculation to be given in milliseconds" and forwards. Some of the things that caused changes in the result files: - As part of fixing tests, I added 'echo' to some comments to be able to easier find out where things where wrong. - MATERIALIZED has now a higher cost compared to X than before. Because of this some MATERIALIZED types have changed to DEPENDEND SUBQUERY. - Some test cases that required MATERIALIZED to repeat a bug was changed by adding more rows to force MATERIALIZED to happen. - 'Filtered' in SHOW EXPLAIN has in many case changed from 100.00 to something smaller. This is because now filtered also takes into account the smallest possible ref access and filters, even if they where not used. Another reason for 'Filtered' being smaller is that we now also take into account implicit filtering done for subqueries using FIRSTMATCH. (main.subselect_no_exists_to_in) This is caluculated in best_access_path() and stored in records_out. - Table orders has changed because more accurate costs. - 'index' and 'ALL' for small tables has changed to use 'range' or 'ref' because of optimizer_scan_setup_cost. - index can be changed to 'range' as 'range' optimizer assumes we don't have to read the blocks from disk that range optimizer has already read. This can be confusing in the case where there is no obvious where clause but instead there is a hidden 'key_column > NULL' added by the optimizer. (main.subselect_no_exists_to_in) - Scan on primary clustered key does not report 'Using Index' anymore (It's a table scan, not an index scan). - For derived tables, the number of rows is now 100 instead of 2, which can be seen in EXPLAIN. - More tests have "Using index for group by" as the cost of this optimization is now more correct (lower). - A primary key could be preferred for a normal key, even if it would access more rows, as it's faster to do 1 lokoup and 3 'index_next' on a clustered primary key than one lookup trough a secondary. (main.stat_tables_innodb) Notes: - There was a 4.7% more calls to best_extension_by_limited_search() in the main.greedy_optimizer test. However examining the test results it looked that the plans where slightly better (eq_ref where more chained together) so I assume this is ok. - I have verified a few test cases where there was notable/unexpected changes in the plan and in all cases the new optimizer plans where faster. (main.greedy_optimizer and some others)
1417 lines
30 KiB
Text
1417 lines
30 KiB
Text
#
|
|
# WL#6742 - Test the interaction of multiple transactions using
|
|
# different isolation levels to make sure that the value returned
|
|
# by count(*) always reflects the correct view of the table according
|
|
# to the transaction's selected isolation level.
|
|
#
|
|
#
|
|
# Traverse various indexes to get the right counts.
|
|
# This especially tests count(*) which is pushed down to InnoDB in WL#6742.
|
|
#
|
|
CREATE TABLE t1 (
|
|
c1 INT AUTO_INCREMENT PRIMARY KEY,
|
|
c2 INT,
|
|
c3 INT,
|
|
c4 INT,
|
|
INDEX k2(c2)
|
|
) Engine=InnoDB;
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1, 1, 1);
|
|
CREATE TABLE t2 LIKE t1;
|
|
INSERT INTO t2 (SELECT * FROM t1);
|
|
affected rows: 10
|
|
info: Records: 10 Duplicates: 0 Warnings: 0
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
55
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
10
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.5000 10 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
#
|
|
# Do some DML in the default connection and leave the transaction pending.
|
|
#
|
|
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
|
BEGIN;
|
|
UPDATE t1 SET c2 = c2 * 3 WHERE c1 = 1;
|
|
affected rows: 1
|
|
info: Rows matched: 1 Changed: 1 Warnings: 0
|
|
DELETE FROM t1 WHERE c1 = 6;
|
|
affected rows: 1
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 1 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
49
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.4444 10 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Start transactions of Repeatable Read, Read Committed, and Read Uncommitted
|
|
#
|
|
# Connection 1 REPEATABLE READ
|
|
#
|
|
connect con1,localhost,root,,;
|
|
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
|
BEGIN;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
55
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
10
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.5000 10 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
UPDATE t1 SET c2 = c2 * 5 WHERE c1 = 2;
|
|
affected rows: 1
|
|
info: Rows matched: 1 Changed: 1 Warnings: 0
|
|
DELETE FROM t1 WHERE c1 = 7;
|
|
affected rows: 1
|
|
INSERT INTO t1(c2,c3,c4) VALUES (100, 1, 1);
|
|
affected rows: 1
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 5 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
59
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
113
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.9000 11 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
11 100
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
#
|
|
# Test a lock wait timeout during COUNT(*)
|
|
#
|
|
SET innodb_lock_wait_timeout = 1;
|
|
SELECT COUNT(*) FROM t1 FOR UPDATE;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
#
|
|
# Connection 2 READ COMMITTED
|
|
#
|
|
connect con2,localhost,root,,;
|
|
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|
BEGIN;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
55
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
10
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.5000 10 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
UPDATE t1 SET c2 = c2 * 7 WHERE c1 = 3;
|
|
affected rows: 1
|
|
info: Rows matched: 1 Changed: 1 Warnings: 0
|
|
DELETE FROM t1 WHERE c1 = 8;
|
|
affected rows: 1
|
|
INSERT INTO t1(c2,c3,c4) VALUES (1000, 1, 1);
|
|
affected rows: 1
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 7 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
12 1000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
59
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
1015
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.9000 12 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
9 1
|
|
10 1
|
|
12 1000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
#
|
|
# Connection 3 READ UNCOMMITTED
|
|
#
|
|
connect con3,localhost,root,,;
|
|
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
BEGIN;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 5 1 1
|
|
3 7 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
12 1000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
57
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
1119
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.3333 12 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
9 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
UPDATE t1 SET c2 = c2 * 11 WHERE c1 = 4;
|
|
affected rows: 1
|
|
info: Rows matched: 1 Changed: 1 Warnings: 0
|
|
INSERT INTO t1(c2,c3,c4) VALUES (10000, 1, 1);
|
|
affected rows: 1
|
|
DELETE FROM t1 WHERE c1 in(9);
|
|
affected rows: 1
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 5 1 1
|
|
3 7 1 1
|
|
4 11 1 1
|
|
5 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
12 1000 1 1
|
|
13 10000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
61
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11128
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.7778 13 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Connection default REPEATABLE READ
|
|
#
|
|
connection default;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 1 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
49
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.4444 10 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Commit the 3 extra connections
|
|
#
|
|
# Connection 1 REPEATABLE READ
|
|
#
|
|
connection con1;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 5 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
59
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
113
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.9000 11 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
11 100
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
#
|
|
# Connection 2 READ COMMITTED
|
|
#
|
|
connection con2;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 7 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
12 1000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
59
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
1015
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.9000 12 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
9 1
|
|
10 1
|
|
12 1000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
#
|
|
# Connection 3 READ UNCOMMITTED
|
|
#
|
|
connection con3;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 5 1 1
|
|
3 7 1 1
|
|
4 11 1 1
|
|
5 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
12 1000 1 1
|
|
13 10000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
61
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11128
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.7778 13 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
COMMIT;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 5 1 1
|
|
3 7 1 1
|
|
4 11 1 1
|
|
5 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
12 1000 1 1
|
|
13 10000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
61
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11128
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.7778 13 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Connection 2 READ COMMITTED
|
|
#
|
|
connection con2;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 7 1 1
|
|
4 11 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
10 1 1 1
|
|
12 1000 1 1
|
|
13 10000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
63
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11024
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.3000 13 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
10 1
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
COMMIT;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 1 1 1
|
|
3 7 1 1
|
|
4 11 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
7 1 1 1
|
|
10 1 1 1
|
|
12 1000 1 1
|
|
13 10000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
63
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11024
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.3000 13 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
7 1
|
|
10 1
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Connection 1 REPEATABLE READ
|
|
#
|
|
connection con1;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 5 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
59
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
113
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.9000 11 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
11 100
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
5
|
|
###############################################
|
|
#
|
|
# Select the first 5 records FOR UPDATE using count(*) in a subquery.
|
|
# The second record is still pending so we get a lock timeout.
|
|
#
|
|
SET innodb_lock_wait_timeout = 1;
|
|
SELECT c1, c2 FROM t1 WHERE c1 < ((SELECT COUNT(*) FROM t1) / 2) FOR UPDATE;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
SELECT COUNT(*) FROM t1 FOR UPDATE;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
COMMIT;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 1 1 1
|
|
2 5 1 1
|
|
3 7 1 1
|
|
4 11 1 1
|
|
5 1 1 1
|
|
6 1 1 1
|
|
10 1 1 1
|
|
11 100 1 1
|
|
12 1000 1 1
|
|
13 10000 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
10
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
10
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
10
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
10
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
67
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11127
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.7000 13 1 1.0000 10
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
6 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Show The EXPLAIN output for these queries;
|
|
#
|
|
EXPLAIN SELECT * FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL #
|
|
EXPLAIN SELECT COUNT(*) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT COUNT(c1) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT COUNT(c2) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT COUNT(c3) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL #
|
|
EXPLAIN SELECT SUM(c1) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT SUM(c2) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL #
|
|
EXPLAIN SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL # Using where
|
|
2 SUBQUERY t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL # Using where
|
|
2 SUBQUERY t1 index NULL k2 5 NULL # Using index
|
|
EXPLAIN SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL # Using where
|
|
2 SUBQUERY t1 index NULL k2 5 NULL # Using index
|
|
#
|
|
# Make all indexes in t2 obsolete to the active repeatable read transaction
|
|
# in the default connection.
|
|
#
|
|
ALTER TABLE t2 row_format=redundant;
|
|
#
|
|
# Connection default REPEATABLE READ
|
|
# Do more DML in the default REPEATABLE READ transaction in order to use recently committed records.
|
|
#
|
|
connection default;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 1
|
|
2 1 1 1
|
|
3 1 1 1
|
|
4 1 1 1
|
|
5 1 1 1
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 1
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
49
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
5.4444 10 1 1.0000 9
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
UPDATE t1 SET c4 = c2 * 10;
|
|
affected rows: 9
|
|
info: Rows matched: 9 Changed: 9 Warnings: 0
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 30
|
|
2 5 1 50
|
|
3 7 1 70
|
|
4 11 1 110
|
|
5 1 1 10
|
|
7 1 1 1
|
|
8 1 1 1
|
|
9 1 1 1
|
|
10 1 1 10
|
|
11 100 1 1000
|
|
12 1000 1 10000
|
|
13 10000 1 100000
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
12
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
12
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
12
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
12
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
85
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11131
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
7.0833 13 1 1.0000 111283
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
7 1
|
|
8 1
|
|
9 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
7
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
6
|
|
###############################################
|
|
#
|
|
# Table t2 has been altered to a new row format.
|
|
# The index should not be useable.
|
|
#
|
|
SELECT COUNT(*) FROM t2;
|
|
ERROR HY000: Table definition has changed, please retry transaction
|
|
SELECT * FROM t2;
|
|
ERROR HY000: Table definition has changed, please retry transaction
|
|
COMMIT;
|
|
SELECT COUNT(*) FROM t2;
|
|
COUNT(*)
|
|
10
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 30
|
|
2 5 1 50
|
|
3 7 1 70
|
|
4 11 1 110
|
|
5 1 1 10
|
|
10 1 1 10
|
|
11 100 1 1000
|
|
12 1000 1 10000
|
|
13 10000 1 100000
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
61
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11128
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.7778 13 1 1.0000 111280
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Connection 2
|
|
#
|
|
connection con2;
|
|
########## innodb_isolation_selects.inc ##########
|
|
SELECT * FROM t1;
|
|
c1 c2 c3 c4
|
|
1 3 1 30
|
|
2 5 1 50
|
|
3 7 1 70
|
|
4 11 1 110
|
|
5 1 1 10
|
|
10 1 1 10
|
|
11 100 1 1000
|
|
12 1000 1 10000
|
|
13 10000 1 100000
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
9
|
|
SELECT COUNT(c1) FROM t1;
|
|
COUNT(c1)
|
|
9
|
|
SELECT COUNT(c2) FROM t1;
|
|
COUNT(c2)
|
|
9
|
|
SELECT COUNT(c3) FROM t1;
|
|
COUNT(c3)
|
|
9
|
|
SELECT SUM(c1) FROM t1;
|
|
SUM(c1)
|
|
61
|
|
SELECT SUM(c2) FROM t1;
|
|
SUM(c2)
|
|
11128
|
|
SELECT AVG(c1), MAX(c1), MIN(c2), AVG(c3), SUM(c4) FROM t1;
|
|
AVG(c1) MAX(c1) MIN(c2) AVG(c3) SUM(c4)
|
|
6.7778 13 1 1.0000 111280
|
|
SELECT c1, c2 FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
c1 c2
|
|
5 1
|
|
10 1
|
|
11 100
|
|
12 1000
|
|
13 10000
|
|
SELECT COUNT(c2) FROM t1 WHERE c1 > ((SELECT COUNT(*) FROM t1) / 2);
|
|
COUNT(c2)
|
|
5
|
|
SELECT COUNT(*) FROM t1 WHERE c1 > (SELECT AVG(c1) FROM t1);
|
|
COUNT(*)
|
|
4
|
|
###############################################
|
|
#
|
|
# Try COUNT(*) on a DISCARDED table.
|
|
#
|
|
connection default;
|
|
CREATE TABLE t4 LIKE t1;
|
|
INSERT INTO t4 (SELECT * FROM t1);
|
|
SELECT COUNT(*) FROM t4;
|
|
COUNT(*)
|
|
9
|
|
ALTER TABLE t4 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t4;
|
|
ERROR HY000: Tablespace has been discarded for table `t4`
|
|
#
|
|
# Test the interaction of a repeatable read transaction
|
|
# to changes that happen outside its view.
|
|
#
|
|
CREATE TABLE t5 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT, aa INT, bb TEXT) Engine=InnoDB;
|
|
INSERT INTO t5(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t5(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t5(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t5(b) VALUES ("inserted by client 1");
|
|
UPDATE t5 SET aa=a, bb=b;
|
|
CREATE TABLE t6 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT, aa INT, bb TEXT) Engine=InnoDB;
|
|
INSERT INTO t6(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t6(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t6(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t6(b) VALUES ("inserted by client 1");
|
|
UPDATE t6 SET aa=a, bb=b;
|
|
CREATE TABLE t7 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT, aa INT, bb TEXT) Engine=InnoDB;
|
|
INSERT INTO t7(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t7(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t7(b) VALUES ("inserted by client 1");
|
|
INSERT INTO t7(b) VALUES ("inserted by client 1");
|
|
UPDATE t7 SET aa=a, bb=b;
|
|
BEGIN;
|
|
SELECT * FROM t5;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
2 inserted by client 1 2 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
SELECT COUNT(*) FROM t5;
|
|
COUNT(*)
|
|
4
|
|
SELECT * FROM t6;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
2 inserted by client 1 2 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
SELECT COUNT(*) FROM t6;
|
|
COUNT(*)
|
|
4
|
|
SELECT * FROM t7;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
2 inserted by client 1 2 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
SELECT COUNT(*) FROM t7;
|
|
COUNT(*)
|
|
4
|
|
#
|
|
# Connection 1
|
|
#
|
|
connection con1;
|
|
INSERT INTO t5(b) VALUES ("inserted by client 2");
|
|
UPDATE t5 SET a = 10 where a = 1;
|
|
UPDATE t5 SET b = "updated by client 2" where a = 2;
|
|
DELETE FROM t5 WHERE a = 3;
|
|
SELECT * FROM t5;
|
|
a b aa bb
|
|
2 updated by client 2 2 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
5 inserted by client 2 NULL NULL
|
|
10 inserted by client 1 1 inserted by client 1
|
|
SELECT COUNT(*) FROM t5;
|
|
COUNT(*)
|
|
4
|
|
INSERT INTO t6(b) VALUES ("inserted by client 2");
|
|
UPDATE t6 SET a = 10 where a = 1;
|
|
UPDATE t6 SET b = "updated by client 2" where a = 2;
|
|
DELETE FROM t6 WHERE a = 3;
|
|
SELECT * FROM t6;
|
|
a b aa bb
|
|
2 updated by client 2 2 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
5 inserted by client 2 NULL NULL
|
|
10 inserted by client 1 1 inserted by client 1
|
|
SELECT COUNT(*) FROM t6;
|
|
COUNT(*)
|
|
4
|
|
INSERT INTO t7(b) VALUES ("inserted by client 2");
|
|
UPDATE t7 SET a = 10 where a = 1;
|
|
UPDATE t7 SET b = "updated by client 2" where a = 2;
|
|
DELETE FROM t7 WHERE a = 3;
|
|
SELECT * FROM t7;
|
|
a b aa bb
|
|
2 updated by client 2 2 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
5 inserted by client 2 NULL NULL
|
|
10 inserted by client 1 1 inserted by client 1
|
|
SELECT COUNT(*) FROM t7;
|
|
COUNT(*)
|
|
4
|
|
#
|
|
# Connection default
|
|
#
|
|
connection default;
|
|
SELECT * FROM t5;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
2 inserted by client 1 2 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
INSERT INTO t5(b) VALUES ("inserted by client 1");
|
|
SELECT * FROM t5;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
2 inserted by client 1 2 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
4 inserted by client 1 4 inserted by client 1
|
|
11 inserted by client 1 NULL NULL
|
|
UPDATE t5 SET a = a + 100;
|
|
SELECT * FROM t5;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
102 updated by client 2 2 inserted by client 1
|
|
104 inserted by client 1 4 inserted by client 1
|
|
105 inserted by client 2 NULL NULL
|
|
110 inserted by client 1 1 inserted by client 1
|
|
111 inserted by client 1 NULL NULL
|
|
SELECT COUNT(*) FROM t5;
|
|
COUNT(*)
|
|
7
|
|
UPDATE t6 SET b = "updated by client 2";
|
|
SELECT * FROM t6;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
2 inserted by client 1 2 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
4 updated by client 2 4 inserted by client 1
|
|
5 updated by client 2 NULL NULL
|
|
10 updated by client 2 1 inserted by client 1
|
|
SELECT * FROM t6 LOCK IN SHARE MODE;
|
|
a b aa bb
|
|
2 updated by client 2 2 inserted by client 1
|
|
4 updated by client 2 4 inserted by client 1
|
|
5 updated by client 2 NULL NULL
|
|
10 updated by client 2 1 inserted by client 1
|
|
SELECT COUNT(*) FROM t6;
|
|
COUNT(*)
|
|
6
|
|
DELETE FROM t7;
|
|
SELECT * FROM t7;
|
|
a b aa bb
|
|
1 inserted by client 1 1 inserted by client 1
|
|
3 inserted by client 1 3 inserted by client 1
|
|
SELECT COUNT(*) FROM t7;
|
|
COUNT(*)
|
|
2
|
|
COMMIT;
|
|
SELECT * FROM t5;
|
|
a b aa bb
|
|
102 updated by client 2 2 inserted by client 1
|
|
104 inserted by client 1 4 inserted by client 1
|
|
105 inserted by client 2 NULL NULL
|
|
110 inserted by client 1 1 inserted by client 1
|
|
111 inserted by client 1 NULL NULL
|
|
SELECT COUNT(*) FROM t5;
|
|
COUNT(*)
|
|
5
|
|
SELECT * FROM t6;
|
|
a b aa bb
|
|
2 updated by client 2 2 inserted by client 1
|
|
4 updated by client 2 4 inserted by client 1
|
|
5 updated by client 2 NULL NULL
|
|
10 updated by client 2 1 inserted by client 1
|
|
SELECT COUNT(*) FROM t6;
|
|
COUNT(*)
|
|
4
|
|
SELECT * FROM t7;
|
|
a b aa bb
|
|
SELECT COUNT(*) FROM t7;
|
|
COUNT(*)
|
|
0
|
|
#
|
|
# Cleanup
|
|
#
|
|
DROP TABLE t1,t2,t4,t5,t6,t7;
|
|
disconnect con1;
|
|
disconnect con2;
|
|
disconnect con3;
|
|
#
|
|
# Bug #23596760: FORCE INDEX IS SKIPPED WHILE EXECUTING SELECT COUNT(*)
|
|
#
|
|
CREATE TABLE t1(c1 INT NOT NULL PRIMARY KEY,
|
|
c2 INT NOT NULL DEFAULT 1,
|
|
c3 char(20) DEFAULT '',
|
|
KEY c2_idx (c2)) ENGINE=InnoDB STATS_PERSISTENT=0;
|
|
INSERT INTO t1(c1) VALUES (1), (2), (3);
|
|
INSERT INTO t1(c1) SELECT c1 + 10 FROM t1;
|
|
INSERT INTO t1(c1) SELECT c1 + 100 FROM t1;
|
|
CREATE TABLE t2 STATS_PERSISTENT=0 SELECT * FROM t1;
|
|
EXPLAIN SELECT COUNT(*) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL c2_idx 4 NULL 12 Using index
|
|
EXPLAIN SELECT COUNT(*) FROM t1 FORCE INDEX(c2_idx);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL c2_idx 4 NULL 12 Using index
|
|
EXPLAIN SELECT COUNT(*) FROM t1, t2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL c2_idx 4 NULL 12 Using index
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 12 Using join buffer (flat, BNL join)
|
|
EXPLAIN SELECT COUNT(*) FROM t1 FORCE INDEX(c2_idx), t2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL c2_idx 4 NULL 12 Using index
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 12 Using join buffer (flat, BNL join)
|
|
DROP TABLE t1, t2;
|