2016-11-25 1 views
0

Ich wollte überprüfen, ob die Abfragen meines Servers Index ordnungsgemäß verwenden. Also habe ich log_queries_not_using_indexes aktiviert und Testfälle ausgeführt.Verstehen MySQL log_queries_not_using_indexes Verhalten

Ich fand heraus, dass die folgende Abfrage auf mysql.slow_log Tabelle geschrieben ist.

SELECT * FROM user_rel 
WHERE (f = '5837be9dc34f747dbd7ba6c7' AND t = '5837be9dc34f747dbd7ba6ca') 
OR (f = '5837be9dc34f747dbd7ba6ca' AND t = '5837be9dc34f747dbd7ba6c7') 
LIMIT 2; 

Aber meine EXPLAIN EXTENDED Ergebnis scheint in Ordnung.

# id, select_type, table, type, possible_keys, key, key_len, ref, rows, filtered, Extra 
'1', 'SIMPLE', 'user_rel', 'range', 'f-t-UNIQUE,t_uid_idx', 'f-t-UNIQUE', '208', NULL, '2', '100.00', 'Using index condition' 

Bitte kann mir jemand erklären, warum diese Abfrage als slow_log geschrieben?


bearbeiten 1

Hier sind mysql Optionen für langsame Abfragen Protokollierung in Bezug auf.

log_output TABLE 
log_queries_not_using_indexes ON 
long_query_time 2.000000 
min_examined_row_limit 0 
slow_query_log ON 
sql_log_off OFF 

bearbeiten 2

Nachdem ich min_examined_row_limit-10 aktualisiert, wird die Abfrage mehr aufkreuzen nicht. Aber warum wirkt sich das auf das log_queries_not_using_indexes Ergebnis aus?

Antwort

0

Hmmm ... riecht nach einem anderen Grund zu vermeiden log_queries_not_using_indexes.

Wenn f und t sind symmetrisch:

Die Tabelle mehr würde effizient abgefragt, wenn Sie ‚sortiert‘ die beiden Spalten, bevor sie gespeichert werden. Sie müssten das OR nicht tun, und es könnte den offensichtlichen Index effizienter verwenden.

+0

Sie schlagen also vor, nur eine Zeile für das eindeutige 'f',' t'-Paar zu behalten. Ich werde versuchen, wie Sie vorschlagen, Refactoring. Vielen Dank. – redism

Verwandte Themen