Is there any configuration not to use index merge in mariadb, if a cardinality of an index is below than that?
1
vote
1
answer
259
views
There is a table have 2 indexes, called state and CATEGORY, which has a very low cardinality respectively 4 and 24 within 7,110,590 rows in the table.
When running query of select statements that includes above 2 indexes in where clause,
an optimizer try to index merge, Using intersect(state,CATEGORY), that is less efficient than even table scan, takes about 20 sec.
Is there any way to except a index if the cardinality of the index is lower than a specific directed number when an optimizer is about to make a execution plan?
The database is MariaDB-1:10.6.11 Community version
But other databases which has lower version than previous mentioned database server, 10.3.28-MariaDB, handles the same query in 5ms.
Servers of older version run a table scan using high cardinality index(date).
All mentioned servers are same replicas of a source database with slightly different versions. Depends on difference of their version, their optimizers create query that have a lot of difference in performance.
What factors could bring that difference?
---
Full explain extended in newer version having low performance
id 1
select_type SIMPLE
table that_table
type index_merge
possible_keys CATEGORY,state
key state,CATEGORY
key_len 6,152
ref NULL
rows 1778388
filtered 100
Extra
Using intersect(state,CATEGORY); Using where; Using filesort
---
Full explain extended in old version having good performance
id 1
select_type SIMPLE
table that_table
type index
possible_keys CATEGORY,state
key DATE
key_len 62
ref NULL
rows 18
filtered 100
Extra Using where
---
Below is indexes on the table
# cardinality: 24, CATEGORY
VARCHAR(50) DEFAULT '' NOT
CREATE INDEX CATEGORY ON that_table (CATEGORY) ;
# cardinality: 4, state
VARCHAR(1) DEFAULT 'Y' NULL;
CREATE INDEX state ON that_table (state);
# cardinality: 7,110,590, DATE
VARCHAR(20) DEFAULT '' NOT NULL;
CREATE INDEX DATE ON that_table (DATE);
---
The problematic query:
EXPLAIN EXTENDED
SELECT *
FROM that_table
WHERE category = 'blabla'
AND state = 'Y'
ORDER BY date DESC
LIMIT 9;
---
A definition of table
CREATE TABLE that_table
(
UID
int(10) NOT NULL AUTO_INCREMENT,
state
varchar(1) DEFAULT 'Y',
CATEGORY
varchar(50) NOT NULL DEFAULT '',
DATE
varchar(20) NOT NULL DEFAULT '',
# .... other columns
PRIMARY KEY (UID
),
KEY DATE
(DATE
),
KEY CATEGORY
(CATEGORY
),
KEY state
(state
),
# ... other indexes
);
Asked by soredive
(111 rep)
Feb 2, 2023, 09:27 AM
Last activity: Jun 1, 2025, 02:08 PM
Last activity: Jun 1, 2025, 02:08 PM