Ho una tabella di oltre 5 milioni di righe. Quando eseguo una query di selezione, sono necessari circa 20 secondi.MYSQL - query di selezione indice e ottimizzazione
SELECT CompUID,Weburl FROM `CompanyTable` WHERE (Alias1='match1' AND Alias2='match2')OR Alias3='match3' OR Alias4='match4'
Ecco la struttura della tabella:
CREATE TABLE `CompanyMaster` (
`CompUID` int(11) NOT NULL AUTO_INCREMENT,
`Weburl` varchar(150) DEFAULT NULL,
`CompanyName` varchar(200) DEFAULT NULL,
`Alias1` varchar(150) DEFAULT NULL,
`Alias2` varchar(150) DEFAULT NULL,
`Alias3` varchar(150) DEFAULT NULL,
`Alias4` varchar(150) DEFAULT NULL,
`Created` datetime DEFAULT NULL,
`LastModified` datetime DEFAULT NULL,
PRIMARY KEY (`CompUID`),
KEY `Alias` (`Alias1`,`Alias2`,`Alias3`,`Alias4`)
) ENGINE=InnoDB AUTO_INCREMENT=5457968 DEFAULT CHARSET=latin1
Qui è la a spiegare da quella query:
--------+------------------------------------------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+------+---------+------+---------+----------------------+
| 1 | SIMPLE | CompanyTable | ALL | Alias | NULL | NULL | NULL | 5255929 | Using where |
+----+-------------+----------+-------+---------------+------+---------+------+---------+----------------------+
ho usato l'indice composito Alias
(Alias1
, Alias2
, Alias3
, Alias4
) . Ma credo che non sia il migliore. Per favore suggeriscimi la giusta indicizzazione per questa ricerca di ricerca selezionata.
L'OR = alias3 'match3' 'O Alias4 = 'match4'' è ciò che sta costringendo la scansione completa della tabella. Questa clausola è essenzialmente non indicizzata. Per ottimizzare questa query, è necessario aggiungere un indice su Alias3 e Alias4. – drew010
È possibile controllare il rendimento della query fornendo un suggerimento simile a questo: 'SELEZIONA COMPUID, Weburl FROM 'CompanyTable' usa indice (Alias) ...'. Questo fa la differenza nelle velocità? – zedfoxus
numero di condivisioni della seguente query: "selezionare il conteggio (*) da" CompanyTable "dove Alias1 =" match1 "AND Alias2 =" match2 ";" e "selezionare il conteggio (*) da" CompanyTable "dove Alias1 =" match3 "" e "select count (*) da" CompanyTable "dove Alias1 =" match4 ". –