как сделать MySql View Filter для каждой таблицы при извлечении

У меня есть мнение, что ведьма работает так:

CREATE VIEW v_myView as SELECT * FROM(
      (SELECT a,b,c,d FROM table1)
    UNION ALL
      (SELECT a,b,c,d FROM table2)
    UNION ALL
      (SELECT a,b,c,d FROM table3)
    .
    .
    .) 

Когда я использую представление, я фильтрую его так:

SELECT * FROM v_myView WHERE a=x

Пока это работает, это занимает час (реальный час, не фигурально говоря). если я сделаю такой запрос:

SELECT * FROM(
      (SELECT a,b,c,d FROM table1 WHERE a=x)
    UNION ALL
      (SELECT a,b,c,d FROM table2 WHERE a=x)
    UNION ALL
      (SELECT a,b,c,d FROM table3 WHERE a=x)
    .
    .
    .) 

это занимает минуту. это заставило меня задуматься, есть ли способ заставить MySql делать это автоматически, а это означает, что команда WHERE будет работать до того, как будет выбрана каждая таблица.


person No Idea For Name    schedule 28.08.2014    source источник


Ответы (1)


Как вы, возможно, уже знаете, второй способ быстрее, потому что в отличие от первого он не приводит к получению всех результатов из всех трех таблиц и последующей фильтрации.

Ответ Леонарда Страшного (https://stackoverflow.com/a/5331792/3996196) мог бы решить это, но создание функции, которая определяет вашу фильтрующую переменную.

Это будет выглядеть примерно так:

Функция (замените Int на свой тип)

create function p1() returns INTEGER DETERMINISTIC NO SQL return @p1;

Просмотреть

CREATE VIEW v_myView as SELECT * FROM(
      (SELECT a,b,c,d FROM table1 WHERE a=p1() )
    UNION ALL
      (SELECT a,b,c,d FROM table2 WHERE a=p1() )
    UNION ALL
      (SELECT a,b,c,d FROM table3 WHERE a=p1() )
    .
    .
    .) 

Запрос (замените 12 своей переменной)

SELECT * FROM (select @p1:=12 p) parm, v_myView;
person Navik Hiralal    schedule 02.09.2014