ID - int, auto increment
A - char(8) DEFAULT NULL,
B - char(8) DEFAULT NULLSELECT count(*) from table WHERE A=xxx OR B=xxx выполняется неадекватно долго, хотя EXPLAIN показывает, что все (вроде бы?) хорошо:possible_keys: A,B
key: A,B
Extra: Using union(A,B); Using where
This often works very well, but sometimes the algorithm’s buffering, sorting, and merging operations use lots of CPU and memory resources. This is especially true if not all of the indexes are very selective, so the parallel scans return lots of rows to the merge operation.
EXPLAIN SELECT `a`, `b`
FROM `test`
WHERE `a` = 1 AND `b` = 1
UNION ALL SELECT `a`, `b`
FROM `test`
WHERE `a` = 1 AND `b` <> 1
UNION ALL SELECT `a`, `b`
FROM `test`
WHERE `a` <> 1 AND `b` = 1;
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
| --- | ------------ | ------------ | ---------- | ----- | ------------- | ------ | ------- | ----------- | ---- | -------- | ------------------------ |
| 1 | PRIMARY | test | | ref | key_ab,key_ba | key_ab | 10 | const,const | 1 | 100 | Using index |
| 2 | UNION | test | | range | key_ab,key_ba | key_ab | 10 | | 9 | 100 | Using where; Using index |
| 3 | UNION | test | | range | key_ab,key_ba | key_ba | 10 | | 9 | 100 | Using where; Using index |EXPLAIN SELECT `a`, `b`
FROM `test`
WHERE NOT(`a` <> 1 AND `b` <> 1);
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
| --- | ----------- | ----- | ---------- | ----- | ------------- | ------ | ------- | --- | ---- | -------- | ------------------------ |
| 1 | SIMPLE | test | | index | key_ab,key_ba | key_ab | 10 | | 100 | 55 | Using where; Using index |
тут дело не в покрытии, а в том что идет поиск прямо в индексеЭто и называется "покрывающий индекс". Если размер записи индекса гораздо меньше размера всей строки, то MySQL может использовать индекс даже для неиндексного поиска (например, LIKE '%vasya%'). Ускорение достигается за счёт более плотного расположения данных в индексе, чем в самой таблице, и, соответственно, лучшего использования кэша диска.