Сейчас есть 2 таблицы, которых в дальнейшем будет 13. Каждая таблица абсолютно идентична по структуре, каждая проиндексирована по нужным параметрам выборки, в общей сумме в таблицах будет записей больше 100 млн. Сейчас 10 млн.
Из них нужно доставать одинаковую информацию максимально быстро, как это можно реализовать?
$res = $DB->query("SELECT SQL_NO_CACHE `id`, `currency`, `pp1` AS `profit`, `psd1` AS `isSD`, `handLimit` FROM `400` WHERE `p1` = 'nickname'
UNION ALL (SELECT `id`, `currency`, `pp2` AS `profit`, `psd2` AS `isSD`, `handLimit` FROM `400` WHERE `p2` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp3` AS `profit`, `psd3` AS `isSD`, `handLimit` FROM `400` WHERE `p3` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp4` AS `profit`, `psd4` AS `isSD`, `handLimit` FROM `400` WHERE `p4` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp5` AS `profit`, `psd5` AS `isSD`, `handLimit` FROM `400` WHERE `p5` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp6` AS `profit`, `psd6` AS `isSD`, `handLimit` FROM `400` WHERE `p6` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp7` AS `profit`, `psd7` AS `isSD`, `handLimit` FROM `400` WHERE `p7` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp8` AS `profit`, `psd8` AS `isSD`, `handLimit` FROM `400` WHERE `p8` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp9` AS `profit`, `psd9` AS `isSD`, `handLimit` FROM `400` WHERE `p9` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp1` AS `profit`, `psd1` AS `isSD`, `handLimit` FROM `200` WHERE `p1` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp2` AS `profit`, `psd2` AS `isSD`, `handLimit` FROM `200` WHERE `p2` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp3` AS `profit`, `psd3` AS `isSD`, `handLimit` FROM `200` WHERE `p3` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp4` AS `profit`, `psd4` AS `isSD`, `handLimit` FROM `200` WHERE `p4` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp5` AS `profit`, `psd5` AS `isSD`, `handLimit` FROM `200` WHERE `p5` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp6` AS `profit`, `psd6` AS `isSD`, `handLimit` FROM `200` WHERE `p6` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp7` AS `profit`, `psd7` AS `isSD`, `handLimit` FROM `200` WHERE `p7` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp8` AS `profit`, `psd8` AS `isSD`, `handLimit` FROM `200` WHERE `p8` = 'nickname')
UNION ALL (SELECT `id`, `currency`, `pp9` AS `profit`, `psd9` AS `isSD`, `handLimit` FROM `200` WHERE `p9` = 'nickname')");
200 и 400 - названия таблиц. Будут еще таблицы 100, 50, и т.д. по уменьшению. Смысл в том, что чем меньше таблица по имени, тем больше в ней информации. Но выборка будет производиться по фильтрам пользователей. Т.е. может быть такое, что пользователь вообще не будет выбирать таблицы 100, 50, 30 , а будет выбирать только 200,400 и выше.
Если разделить этот запрос на 2 селекта (по 1 к разной таблице) то работает это на 10% быстрее. Боюсь представить, что будет, когда в этом одном запросе будет 10 таблиц, будет овермиллион юнионов..
EXPLAIN сейчас выглядит так:
+------+--------------+-----------------------------------------------------+------+---------------+------+---------+-------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+--------------+-----------------------------------------------------+------+---------------+------+---------+-------+-------+-------------+
| 1 | PRIMARY | 400 | ref | p1 | p1 | 62 | const | 715 | Using where |
| 2 | UNION | 400 | ref | p2 | p2 | 62 | const | 723 | Using where |
| 3 | UNION | 400 | ref | p3 | p3 | 62 | const | 888 | Using where |
| 4 | UNION | 400 | ref | p4 | p4 | 62 | const | 853 | Using where |
| 5 | UNION | 400 | ref | p5 | p5 | 62 | const | 604 | Using where |
| 6 | UNION | 400 | ref | p6 | p6 | 62 | const | 294 | Using where |
| 7 | UNION | 400 | ref | p7 | p7 | 62 | const | 1038 | Using where |
| 8 | UNION | 400 | ref | p8 | p8 | 62 | const | 740 | Using where |
| 9 | UNION | 400 | ref | p9 | p9 | 62 | const | 337 | Using where |
| 10 | UNION | 200 | ref | p1 | p1 | 62 | const | 10470 | Using where |
| 11 | UNION | 200 | ref | p2 | p2 | 62 | const | 7234 | Using where |
| 12 | UNION | 200 | ref | p3 | p3 | 62 | const | 13723 | Using where |
| 13 | UNION | 200 | ref | p4 | p4 | 62 | const | 8973 | Using where |
| 14 | UNION | 200 | ref | p5 | p5 | 62 | const | 8454 | Using where |
| 15 | UNION | 200 | ref | p6 | p6 | 62 | const | 9412 | Using where |
| 16 | UNION | 200 | ref | p7 | p7 | 62 | const | 18221 | Using where |
| 17 | UNION | 200 | ref | p8 | p8 | 62 | const | 13322 | Using where |
| 18 | UNION | 200 | ref | p9 | p9 | 62 | const | 2475 | Using where |
| NULL | UNION RESULT | <union1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18> | ALL | NULL | NULL | NULL | NULL | NULL | |
+------+--------------+-----------------------------------------------------+------+---------------+------+---------+-------+-------+-------------+
Сборка персонального компьютера от Artline: умный выбор для современных пользователей