Mariadb Ignorando l'indice della forza
-
31-10-2019 - |
Domanda
Sto cercando di sintonizzare una domanda relativamente semplice:
select bt.col1,bt.col2
from bigtable bt
join smalltable st on bt.smalltable_id = st.smalltable_id
where st.name = 'some name occuring only once in st'
limit 10
Il numero di partite in bigtable
è relativamente piccolo rispetto alla dimensione complessiva (<1%)
Ecco il piano di spiegazione:
+------+-------------+-------+--------+-----------------+---------+---------+-----------------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+--------+-----------------+---------+---------+-----------------+----------+-------------+
| 1 | PRIMARY | bt | ALL | ix_smalltable_id| NULL | NULL | NULL | 22709766 | Using where |
| 1 | PRIMARY | st | eq_ref | PRIMARY,ix_name | PRIMARY | 2 | bt.smalltable_id| 1 | Using where |
+------+-------------+-------+--------+-----------------+---------+---------+-----------------+----------+-------------+
In qualche modo, anche se sarebbe più facile raccogliere l'indice, non lo fa.
Ho quindi provato a forzare l'indice:
select bt.col1,bt.col2
from bigtable bt force index (ix_smalltable_id)
join smalltable st on bt.smalltable_id = st.smalltable_id
where st.name = 'some name occuring only once in st'
limit 10
Ma il piano di query e il tempo di query sono uguali. Non vuole usare l'indice.
Ho provato a fare dove bt.smalltable_id in (select ...), ma stesso piano di query e tempo.
Ma se prendo il smalltable_id
Prima, e poi incorporarlo nella selezione, è molto più veloce.
La domanda
Posso forzare l'indice abilitando alcune flag? È una limitazione del motore di query?
Struttura della tabella
CREATE TABLE `smalltable` (
`smalltable_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`smalltable_id`),
KEY `ix_name` (`name`(10))
) ENGINE=InnoDB AUTO_INCREMENT=5698 DEFAULT CHARSET=utf8
CREATE TABLE `bigtable` (
`bigtable_id` bigint unsigned NOT NULL AUTO_INCREMENT,
`col1` varchar(255) DEFAULT NULL,
`col2` varchar(255) DEFAULT NULL,
...
`smalltable_id` smallint(5) unsigned DEFAULT NULL,
PRIMARY KEY (`bigtable_id`),
KEY `ix_smalltable_id` (`smalltable_id`)
) ENGINE=InnoDB AUTO_INCREMENT=23167374 DEFAULT CHARSET=utf8
Nessuna soluzione corretta
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange