Van egy ilyesmi tablam:
MariaDB [clapf]> show create table token;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| token | CREATE TABLE `token` (
`token` bigint(20) unsigned NOT NULL,
`uid` smallint(5) unsigned NOT NULL DEFAULT 0,
`nham` int(11) DEFAULT 0,
`nspam` int(11) DEFAULT 0,
`timestamp` int(10) unsigned DEFAULT 0,
KEY `token_idx1` (`token`),
KEY `token_idx2` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
A 10.2-es mariadb hoszton az alabbi select explain eredmenyt kapom:
MariaDB [clapf]> explain SELECT token, nham, nspam FROM token WHERE token in (13036551635545399192,5805177638834534979,5887110958975549203,48491888334302022) and uid=0;
+------+-------------+-------+-------+-----------------------+------------+---------+------+------+------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+-------+-----------------------+------------+---------+------+------+------------------------------------+
| 1 | SIMPLE | token | range | token_idx1,token_idx2 | token_idx1 | 8 | NULL | 4 | Using index condition; Using where |
+------+-------------+-------+-------+-----------------------+------------+---------+------+------+------------------------------------+
1 row in set (0.00 sec)
A db-t kidumpoltam, attettem egy 10.3-as mariadb hosztra, ami viszont ugyanerre select-re egeszen mast ad vissza:
MariaDB [clapf]> explain SELECT token, nham, nspam FROM token WHERE token in (13036551635545399192,5805177638834534979,5887110958975549203,48491888334302022) and uid=0;
+------+-------------+-------+------+-----------------------+------------+---------+-------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+-----------------------+------------+---------+-------+--------+-------------+
| 1 | SIMPLE | token | ref | token_idx1,token_idx2 | token_idx2 | 2 | const | 837534 | Using where |
+------+-------------+-------+------+-----------------------+------------+---------+-------+--------+-------------+
Ennek megfeleloen (a full table scan-nek hala) sokkal tovabb tart, mig a select eredmenyet megkapom.
Meg annyi erdekesseg, hogy a 10.2 es 10.3 optimizer_switch valtozoja csak abban ter el, hogy 10.3-on meg a split_materialized=on is benne van.
A show index from token mindket helyen ugyanazt adja vissza:
show index from token;
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| token | 1 | token_idx1 | 1 | token | A | 1675388 | NULL | NULL | | BTREE | | |
| token | 1 | token_idx2 | 1 | uid | A | 2 | NULL | NULL | | BTREE | | |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
A kerdesem ezek utan csak annyi, hogy wtf?