Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Объясните пожалуйста как это работает? / 12 сообщений из 12, страница 1 из 1
02.10.2013, 21:17:46
    #38414866
Yakunin_Yura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните пожалуйста как это работает?
"Поиск по двум ключам"

Запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TEMPORARY TABLE tmp
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1';

INSERT INTO tmp
SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1';

SELECT * from tmp;

DROP TABLE tmp;


Объясните пожалуйста как это работает? мне кажется, что "INSERT INTO tmp" должно стоять либо после каждого Select-а либо после обоих! а тут как-то странно.

Модератор: Пользуйтесь тэгом SRC для выделения кода.
...
Рейтинг: 0 / 0
02.10.2013, 21:48:25
    #38414886
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните пожалуйста как это работает?
Yakunin_Yura,
всё правильно
для первого http://dev.mysql.com/doc/refman/5.1/en/create-table-select.html

а второй - простой инсерт
...
Рейтинг: 0 / 0
02.10.2013, 22:20:28
    #38414896
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните пожалуйста как это работает?
Yakunin_YuraОбъясните пожалуйста как это работает?Думаю, что неправильно. Запись, где оба поля - единицы, задвоится.
...
Рейтинг: 0 / 0
03.10.2013, 08:27:57
    #38415007
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните пожалуйста как это работает?
Yakunin_Yura"Поиск по двум ключам"

Объясните пожалуйста как это работает? мне кажется, что "INSERT INTO tmp" должно стоять либо после каждого Select-а либо после обоих! а тут как-то странно.Демонстрация работы с временными таблицами.

Сначала результаты запроса сохраняются для дальнейшей обработки в (отсутствующей на этот момент) временнтй таблице.

Затем в только что созданную таблицу добавляются другие данные.

Накопленные двумя запросами SELECT данные выдаются в качестве результата работы, а временная таблица больше не нужна, и поэтому сразу же удаляется. Только я бы явно написал DROP TEMPORARY TABLE tmp

PS. Команда INSERT пишется не после, а перед SELECT :)

PPS. Без использования временных таблиц запрос пишется в 1 операцию:
Код: sql
1.
SELECT field1_index, field2_index FROM test_table WHERE  '1' IN (field1_index, field2_index);
...
Рейтинг: 0 / 0
03.10.2013, 08:30:01
    #38415008
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните пожалуйста как это работает?
Или с использованием UNION — для задействования индексов по обоим полям
...
Рейтинг: 0 / 0
03.10.2013, 09:09:24
    #38415025
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните пожалуйста как это работает?
Cygapb-007Или с использованием UNION — для задействования индексов по обоим полямОпять - UNION ALL даст дубль, а простой UNION - дополнительную сортировку.
Также не убеждён, что масик сможет использовать индекс в конструкции
Код: sql
1.
WHERE  '1' IN (field1_index, field2_index)

А вот в варианте
Код: sql
1.
WHERE  '1' = field1_index OR '1' = field2_index

точно сможет:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
-- Создание тест-таблицы
mysql> create table test(f1 int, f2 int, f3 int);
Query OK, 0 rows affected (0.36 sec)

-- Создание всех мыслимых индексов keyXYZ(fX,fY,fZ) - 15 штук
-- поскипано.

-- Наполнение RAND данными (таблица digits содержит числа 0..9)

mysql> insert into test (f1,f2,f3) select 1+100*d1.digit+10*d2.digit+d3.digit, CAST(10*rand() AS UNSIGNED), CAST(10*rand() AS UNSIGNED) from digits d1, digits d2, digits d3 order by 1;
Query OK, 1000 rows affected (1.94 sec)
Records: 1000  Duplicates: 0  Warnings: 0

-- Просмотр планов запросов
mysql> explain select f1 from test where 1 in (f2,f3);
+----+-------------+-------+-------+---------------+--------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+--------+---------+------+------+--------------------------+
|  1 | SIMPLE      | test  | index | NULL          | key123 | 15      | NULL | 1000 | Using where; Using index |
+----+-------------+-------+-------+---------------+--------+---------+------+------+--------------------------+
1 row in set (0.00 sec)

mysql> explain select f1 from test where 1 = f2 or 1 = f3;
+----+-------------+-------+-------------+---------------------------------------------------------------+-----------+---------+------+------+-------------------------------------+
| id | select_type | table | type        | possible_keys                                                 | key       | key_len | ref  | rows | Extra                               |
+----+-------------+-------+-------------+---------------------------------------------------------------+-----------+---------+------+------+-------------------------------------+
|  1 | SIMPLE      | test  | index_merge | key2,key3,key23,key21,key31,key32,key213,key231,key312,key321 | key2,key3 | 5,5     | NULL |  218 | Using union(key2,key3); Using where |
+----+-------------+-------+-------------+---------------------------------------------------------------+-----------+---------+------+------+-------------------------------------+
1 row in set (0.00 sec)
...
Рейтинг: 0 / 0
03.10.2013, 11:25:17
    #38415217
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните пожалуйста как это работает?
AkinaОпять - UNION ALL даст дубль Да что Вы говорите! Неужели?
Код: sql
1.
2.
3.
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'
UNION ALL
SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1' AND field1_index <> '1';
...
Рейтинг: 0 / 0
03.10.2013, 11:41:52
    #38415248
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните пожалуйста как это работает?
Cygapb-007,

можно всё же написать через OR и надеяться, что мускль догадается использовать index merge :)
...
Рейтинг: 0 / 0
03.10.2013, 11:58:56
    #38415282
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните пожалуйста как это работает?
Akina id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE test index_merge key2; key3; key23; key21; key31; key32; key213; key231; key312; key321 key2;key3 5;5 NULL 218 Using union(key2;key3) ; Using where Спасибо, не знал про union key :)
...
Рейтинг: 0 / 0
03.10.2013, 12:05:58
    #38415303
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните пожалуйста как это работает?
Cygapb-007AkinaОпять - UNION ALL даст дубль Да что Вы говорите! Неужели?
Код: sql
1.
2.
3.
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'
UNION ALL
SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1' AND field1_index <> '1';

Код: sql
1.
2.
3.
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'
UNION ALL
SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1' AND (field1_index <> '1' OR field1_index IS NULL);

насколько я понимаю...

Но UNION ALL может привести к материализации промежуточного результата подзапросов.
...
Рейтинг: 0 / 0
03.10.2013, 12:19:49
    #38415321
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните пожалуйста как это работает?
miksoftНо UNION ALL может привести к материализации промежуточного результата подзапросов.Собственно, стартовый пост и демонстрирует принцип работы материализации, в "развернутом" виде. :)
...
Рейтинг: 0 / 0
03.10.2013, 15:22:55
    #38415648
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните пожалуйста как это работает?
Cygapb-007Да что Вы говорите! Неужели?Ну это же типичное строгание костылей. Нашли проблему - заткнули пальцем... найдём вторую - а пальцев десять...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Объясните пожалуйста как это работает? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]