MySQL Одинаковый запрос в разные таблицы

170
11 января 2019, 23:00

Сейчас есть 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  |             |
+------+--------------+-----------------------------------------------------+------+---------------+------+---------+-------+-------+-------------+
READ ALSO
Yii 2 проблема с поддоменом .htaccess

Yii 2 проблема с поддоменом .htaccess

Всем привет, начал проект на yii 2, теперь хочу его разместить на поддомене, только не получается никак правильно настроитьhtaccess Сейчас нормально...

171
Разница между двумя датами в формате

Разница между двумя датами в формате

Есть две даты, скажем 01/11/2016 и 05/11/2017

162
Google Authenticator: Invalid barcode

Google Authenticator: Invalid barcode

Хочу использовать 2FA от google, подключил эту библиотеку, написал следующий код:

174
Скачать xml по ссылке .php

Скачать xml по ссылке .php

Есть ссылка на файл - siteru/export

254