He leído artículos sobre FORCE
índices, pero ¿cómo puedo forzar a MySQL a IGNORE ALL
indexar?
Lo intenté SELECT * FROM tbl IGNORE INDEX(*)
, pero no tuve éxito.
En cuanto a por qué yo (y otros) necesitamos hacer esto: por ejemplo, necesitaba resumir las estadísticas de los árbitros de la siguiente manera:
SELECT
count(*) as c,
SUBSTRING
(
domain_name,
LENGTH(domain_name) - LOCATE('.', REVERSE(domain_name)) + 2
) as tld
FROM `domains_import`
IGNORE INDEX(domain_name)
GROUP BY tld
ORDER BY c desc
LIMIT 100
... pero siempre tengo que mirar qué índices están definidos o determinar qué índice se usará a través de Explain. Sería muy útil simplemente escribir IGNORE INDEX ALL
y simplemente no importarle.
¿Alguien sabe la sintaxis o un truco? (Decenas de líneas a través de tablas de definición de MySQL realmente no son un atajo).
Agregado de la discusión del chat :
Bechmark:
sin índice = 148.5 segundos
con índice = 180 segundos y aún ejecutándose con el envío de datos La matriz SSD es tan poderosa que casi no le importa el caché de datos ...
Definición de referencia:
CREATE TABLE IF NOT EXISTS `domains_import` (
`domain_id` bigint(20) unsigned NOT NULL,
`domain_name` varchar(253) CHARACTER SET ascii COLLATE ascii_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `domains_import`
ADD PRIMARY KEY (`domain_id`),
ADD UNIQUE KEY `domain_name` (`domain_name`);
ALTER TABLE `domains_import`
MODIFY `domain_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT;
InnoDB, la prueba con índice (sin USE INDEX () o similar) todavía se está ejecutando, 250 segundos, simplemente la maté.
LEFT JOIN
que tenía. `USE INDEX ()` hizo que MySQL escaneara una tabla en una tabla de 20K filas y 1 a 1JOIN
s en lugar de cruzar 500 filas entre dos índices. Obtuve 20 veces más rápido.