Bug #116335 | Multi-valued index isn't used with some range scans on composite indexes | ||
---|---|---|---|
Submitted: | 10 Oct 2024 16:53 | Modified: | 11 Oct 2024 8:03 |
Reporter: | Maciej Dobrzanski | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S5 (Performance) |
Version: | 8.0.39 | OS: | Any |
Assigned to: | CPU Architecture: | Any | |
Tags: | Multi-Valued Indexes, Optimizer |
[10 Oct 2024 16:53]
Maciej Dobrzanski
[10 Oct 2024 16:56]
Maciej Dobrzanski
mvi.sql
Attachment: mvi.sql (application/octet-stream, text), 4.43 MiB.
[11 Oct 2024 8:03]
MySQL Verification Team
Hello Maciej, Thank you for the report and test case. regards, Umesh
[10 Sep 1:54]
Yoseph Phillips
I believe we are seeing the same issue which is also related to issues 87613 and 71334. The following shows that IN performs well and only examines about 100 rows, however INNER JOIN is examining more than 16,000 rows and performing terribly. DROP PROCEDURE IF EXISTS createTestData; DELIMITER $$ CREATE PROCEDURE createTestData() BEGIN DECLARE counter INT DEFAULT 0; SET time_zone = '+00:00'; DROP TABLE IF EXISTS test_data; CREATE TABLE test_data ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, column1 TINYINT UNSIGNED NOT NULL, column2 MEDIUMINT UNSIGNED NOT NULL, column3 TIMESTAMP NOT NULL, column4 VARCHAR(1000), PRIMARY KEY (id), INDEX column1_column2_index (column1, column2), INDEX column1_column3_index (column1, column3) ); INSERT INTO test_data (column1, column2, column3, column4) VALUES ( floor(rand() * 256), floor(rand() * 16777216), '2025-09-10 00:00:00' - INTERVAL floor(rand() * 16777216) MINUTE, 'The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.' ); WHILE counter < 20 DO INSERT INTO test_data (column1, column2, column3, column4) SELECT floor(rand() * 256), floor(rand() * 16777216), '2025-09-10 00:00:00' - INTERVAL floor(rand() * 16777216) MINUTE, t.column4 FROM test_data t; SET counter = counter + 1; END WHILE; END$$ DELIMITER ; CALL createTestData(); DROP PROCEDURE IF EXISTS createTestData; DROP TEMPORARY TABLE IF EXISTS test_data2; CREATE TEMPORARY TABLE test_data2 (id TINYINT UNSIGNED NOT NULL, PRIMARY KEY (id)); INSERT INTO test_data2 (id) VALUES (50), (100), (150), (200); EXPLAIN ANALYZE SELECT count(*) FROM test_data t WHERE t.column1 IN (50, 100, 150, 200) AND t.column2 > (16777216 - 100000); EXPLAIN ANALYZE SELECT count(*) FROM test_data t WHERE t.column1 IN (50, 100, 150, 200) AND t.column3 > ('2025-09-10 00:00:00' - INTERVAL 100000 MINUTE); EXPLAIN ANALYZE SELECT count(*) FROM test_data t INNER JOIN test_data2 t2 ON t2.id = t.column1 WHERE t.column2 > (16777216 - 100000); EXPLAIN ANALYZE SELECT count(*) FROM test_data t INNER JOIN test_data2 t2 ON t2.id = t.column1 WHERE t.column3 > ('2025-09-10 00:00:00' - INTERVAL 100000 MINUTE); DROP TEMPORARY TABLE IF EXISTS test_data2;