powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как ускорить выборку
17 сообщений из 17, страница 1 из 1
Как ускорить выборку
    #38382433
Obsess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть информация следующего типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
 Тема  ФИО    Время                 Значение 
Плита Иванов 2013-09-12 14:25:01   234
Плита Иванов 2013-09-12 14:25:02   234
Плита Иванов 2013-09-12 14:25:03   234
Плита Иванов 2013-09-12 14:25:04   235
Плита Иванов 2013-09-12 14:25:05   235
Плита Петров 2013-09-12 14:25:01   234
Время не уникально, значение тоже. ФИО и время уникальны - по ним сделан первичный ключ в таблице.
Так выглядит БД с 3-мя таблицами MyISAM:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
-- Table structure for table `theme`
CREATE TABLE `theme` (
  `name` varchar(20) NOT NULL,
  `id_theme` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id_theme`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

-- Table structure for table `person`
CREATE TABLE `person` (
  `name` varchar(60) NOT NULL,
  `id_theme` int(10) unsigned NOT NULL,
  `id_person` bigint(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id_person`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

-- Table structure for table `param`
CREATE TABLE `param` (
  `val` bigint(11) NOT NULL,
  `dtime` bigint(13) unsigned NOT NULL, -- время в формате unix_timestamp()
  `id_person` bigint(11) unsigned NOT NULL,
  `id_param` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`dtime`,`id_person`),
  UNIQUE KEY `id_param` (`id_param`)
) ENGINE=MyISAM AUTO_INCREMENT=11202 DEFAULT CHARSET=utf8;



Данные нужно вывести по изменению значения у ФИО. Т.е. для приведённой таблицы данные результат выглядит так:
Код: plaintext
1.
2.
3.
 Тема  ФИО    Время                 Значение 
Плита Иванов 2013-09-12 14:25:01   234
Плита Иванов 2013-09-12 14:25:04   235
Плита Петров 2013-09-12 14:25:01   234

Запрос выглядит так ( http://www.sql.ru/forum/1021188/ne-poymu-kak-sostavit-zapros-i-vozmozhno-li):

Код: plsql
1.
2.
3.
4.
5.
select t1.dtime, prs.name, t1.val from param as t1 join person as prs using(id_person)
       join theme on theme.id_theme=prs.id_theme
       where t1.val!= ifnull(
       (select val from param as t2 where t1.id_person=t2.id_person and t2.dtime<t1.dtime order by t2.dtime desc limit 1),-1)
       and theme.name = 'plita' order by id_person, dtime;



При количестве записей больше 10 тыс. время выполнения запроса составляет около 4 мин, что слишком долго.
Как можно организовать БД по-другому, чтобы ускорить выполнение запроса?
Или составить запрос по-другому?
Ещё непонятно следующее:
у меня первичный ключ в таблице param по (dtime, id_person). Я думал, что это означает, что данные уже хранятся в отсортированном виде по времени и id_person. А значит строчка order by t2.dtime в запросе не нужна. Но без неё запрос выполняется неправильно. Почему?

Во вложении архив со скриптом с 11 тыс. данными.
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38382494
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ObsessЕсть информация следующего типа:
Тема ФИО Время ЗначениеПлита Иванов 2013-09-12 14:25:01 234Плита Иванов 2013-09-12 14:25:02 234Плита Иванов 2013-09-12 14:25:03 234Плита Иванов 2013-09-12 14:25:04 235Плита Иванов 2013-09-12 14:25:05 235Плита Петров 2013-09-12 14:25:01 234Вы свой дамп видели? Где там кириллица? Где там дата? ваши данные выглядят вот так:

valdtimeid_personid_param436902654789145114369013869116721243690138691167313436901386911674144369013869116751543690138691167616436901386911677174369013869116781843690138691167919436901386911680110
И одно с другим хреновенько соотносится - даже порядок полей иной.
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38382650
Obsess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaВы свой дамп видели? Где там кириллица? Где там дата?
Код: plsql
1.
`dtime` bigint(13) unsigned NOT NULL, -- время в формате unix_timestamp().

При выводе отобразить это можно в виде даты FROM_UNIXTIME(). Хранить лучше в виде числа.
Какая разница кириллица или латиница? От этого запрос изменится?
AkinaИ одно с другим хреновенько соотносится - даже порядок полей иной.
Данные в таблице приведены как пример. Я думаю, запрос к таблице и суть вопроса ( как ускорить запрос? ) не меняется из-за другого порядка полей в таблице и от того кириллица там или японский алфавит.
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38382654
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ObsessAkinaИ одно с другим хреновенько соотносится - даже порядок полей иной.
Данные в таблице приведены как пример. Я думаю, запрос к таблице и суть вопроса ( как ускорить запрос? ) не меняется из-за другого порядка полей в таблице и от того кириллица там или японский алфавит.
Не, я понимаю, пятница и всё такое... но всё-таки...

Ладно, ФИО == id_person, Время == dtime, Значение == val... но, блин, чё за id_param и куда девалать Тема?
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38382812
Obsess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaЛадно, ФИО == id_person, Время == dtime, Значение == val... но, блин, чё за id_param и куда девалать Тема?
БД состоит из 3 таблиц: в одной содержится ФИО (person), во второй Тема (theme), в третьей Параметры (param). id_param добавлен в таблицу param для того, чтобы привести её к нормальной форме .
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38382943
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ObsessБД состоит из 3 таблиц: в одной содержится ФИО (person), во второй Тема (theme), в третьей Параметры (param).Т.е. значимая таблица - первая, остальные - просто словари, и могут присоединяться не вначале, а на конечной стадии, когда вся обработка завершена.

Obsessid_param добавлен в таблицу param для того, чтобы привести её к нормальной форме.Нормальная форма нахрен тут не нужна. А вот то, что теперь значение этого поля заменит файлово-ориентированную позиционность - ценно.

С учётом этого мы можем поставить задачу для себя. Будем считать группой набор записей такой, что у всех записей совпадают значения val и id_person, и эта пара одинакова для любого id_param в пределах от минимального до максимального значения в группе. Вот для каждой такой группы нужно вывести запись с минимальным id_param.

Еслит бы пара не повторялась (в группе не было разрывов), всё было бы просто:
Код: sql
1.
2.
3.
select min(dtime), val, id_person
from param
group by val, id_person;


Увы... значит, надо вычленять эти смены.
Группа начинается тем id_person, для которого у предыдущего id_person (минус один) значение этой пары иное, и кончается тем id_person, для которого иное значение у следующего id_person (плюс один соответственно). Что приятно - так это то, что неравенство, так что и на самых краях (где id_person-1 или id_person+1) в таблице отсутствуют, соответственно null, сравнение с ним всё равно даёт false.

Увы, поздно, нет времени дописАть... завтра.
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38383281
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, продолжим.
Во-первых, запрос исходного поста. Немножко подкорректированный в части вывода... чтобы посмотреть поподробнее на результат, а заодно получить сравнение быстродействия систем.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
mysql> select t1.*, prs.name
    -> from param as t1 join person as prs using(id_person)
    -> join theme on theme.id_theme=prs.id_theme
    -> where t1.val!= ifnull(
    -> (select val from param as t2 where t1.id_person=t2.id_person and t2.dtime<t1.dtime order by t2.dtime desc limit 1),-1)
    -> and theme.name = 'plita' order by id_person, dtime;
+-------+------------+-----------+----------+--------+
| val   | dtime      | id_person | id_param | name   |
+-------+------------+-----------+----------+--------+
| 43690 | 1386911672 |         1 |        2 | Ivanov |
|  6826 | 1386912672 |         1 |      102 | Ivanov |
| 10922 | 1386913672 |         1 |      202 | Ivanov |
|   170 | 1396913672 |         1 |     1202 | Ivanov |
| 43690 | 2654789145 |         1 |        1 | Ivanov |
+-------+------------+-----------+----------+--------+
5 rows in set (5 min 15.84 sec)


Выполнение 5 минут - сравнимо.

Любопытно тут - id_param. Чтобы понять, что именно любопытно, делаем тривиальное
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
mysql> select * from param limit 10;
+-------+------------+-----------+----------+
| val   | dtime      | id_person | id_param |
+-------+------------+-----------+----------+
| 43690 | 2654789145 |         1 |        1 |
| 43690 | 1386911672 |         1 |        2 |
| 43690 | 1386911673 |         1 |        3 |
| 43690 | 1386911674 |         1 |        4 |
| 43690 | 1386911675 |         1 |        5 |
| 43690 | 1386911676 |         1 |        6 |
| 43690 | 1386911677 |         1 |        7 |
| 43690 | 1386911678 |         1 |        8 |
| 43690 | 1386911679 |         1 |        9 |
| 43690 | 1386911680 |         1 |       10 |
+-------+------------+-----------+----------+
10 rows in set (0.00 sec)


Забавно - самая первая запись представляет собой самостоятельную группу... причём из-за сортировки по dtime... интересно, так и должно быть? Ну да ладно.
А вот дальше - начнём искать те самые границы. Для чего попробуем вот что:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
mysql> select t1.*,t2.id_param,t3.id_param
    -> from param t1
    -> left join param t2 on t1.val=t2.val and t1.id_person=t2.id_person and t2.id_param=t1.id_param+1
    -> left join param t3 on t1.val=t3.val and t1.id_person=t3.id_person and t3.id_param=t1.id_param-1
    -> where t3.id_param is null or t2.id_param is null
    -> ;
+-------+------------+-----------+----------+----------+----------+
| val   | dtime      | id_person | id_param | id_param | id_param |
+-------+------------+-----------+----------+----------+----------+
| 43690 | 2654789145 |         1 |        1 |        2 |     NULL |
| 43690 | 1386911771 |         1 |      101 |     NULL |      100 |
|  6826 | 1386912672 |         1 |      102 |      103 |     NULL |
|  6826 | 1386912771 |         1 |      201 |     NULL |      200 |
| 10922 | 1386913672 |         1 |      202 |      203 |     NULL |
| 10922 | 1386914671 |         1 |     1201 |     NULL |     1200 |
|   170 | 1396913672 |         1 |     1202 |     1203 |     NULL |
|   170 | 1396923671 |         1 |    11201 |     NULL |    11200 |
+-------+------------+-----------+----------+----------+----------+
8 rows in set (0.17 sec)

Несмотря на три копии, отрабатывает очень быстро. Правда, пропускает ту самую группу из одной записи. Попробуем это исправить, добавив условие увеличения dtime
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
mysql> select t1.*,t2.id_param,t3.id_param
    -> from param t1
    -> left join param t2 on t1.val=t2.val and t1.id_person=t2.id_person and t2.id_param=t1.id_param+1 and t2.dtime>t1.dtime
    -> left join param t3 on t1.val=t3.val and t1.id_person=t3.id_person and t3.id_param=t1.id_param-1 and t3.dtime<t1.dtime
    -> where t3.id_param is null or t2.id_param is null
    -> ;
+-------+------------+-----------+----------+----------+----------+
| val   | dtime      | id_person | id_param | id_param | id_param |
+-------+------------+-----------+----------+----------+----------+
| 43690 | 2654789145 |         1 |        1 |     NULL |     NULL |
| 43690 | 1386911672 |         1 |        2 |        3 |     NULL |
| 43690 | 1386911771 |         1 |      101 |     NULL |      100 |
|  6826 | 1386912672 |         1 |      102 |      103 |     NULL |
|  6826 | 1386912771 |         1 |      201 |     NULL |      200 |
| 10922 | 1386913672 |         1 |      202 |      203 |     NULL |
| 10922 | 1386914671 |         1 |     1201 |     NULL |     1200 |
|   170 | 1396913672 |         1 |     1202 |     1203 |     NULL |
|   170 | 1396923671 |         1 |    11201 |     NULL |    11200 |
+-------+------------+-----------+----------+----------+----------+
9 rows in set (0.17 sec)

Во-о-от... время видишь? мухой летит...

Теперь спокойненько режь эту ерунду на 2 запроса - один ищет начала диапазонов, второй концы, затем линкуй их и находи границы... Ну в общем должно полететь. А мне уже лениво стало.
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38384213
Obsess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, огромное спасибо.

Только есть ещё вопрос.

Записи в таблицу необязательно вставляются в хронологическом порядке. Если посмотреть таблицу из следующих трёх записей:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select * from param;
+-----------+-------+-----+----------+
| id_person | dtime | val | id_param |
+-----------+-------+-----+----------+
|         1 |   380 |  10 |        1 |
|         1 |   382 |  10 |        2 |
|         1 |   381 |  10 |        3 |
+-----------+-------+-----+----------+
3 rows in set (0.00 sec)



То, запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
select t1.*,t2.id_param,t3.id_param
    -> from param t1
    -> left join param t2 on t1.val=t2.val and t1.id_person=t2.id_person and t2.id_param=t1.id_param+1 and t2.dtime>t1.dtime
    -> left join param t3 on t1.val=t3.val and t1.id_person=t3.id_person and t3.id_param=t1.id_param-1 and t3.dtime<t1.dtime
    -> where t3.id_param is null or t2.id_param is null
    -> order by t1.dtime
    -> ;


выдаст следующую таблицу:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
+-----------+-------+-----+----------+----------+----------+
| id_person | dtime | val | id_param | id_param | id_param |
+-----------+-------+-----+----------+----------+----------+
|         1 |   380 |  10 |        1 |        2 |     NULL |
|         1 |   381 |  10 |        3 |     NULL |     NULL |
|         1 |   382 |  10 |        2 |     NULL |        1 |
+-----------+-------+-----+----------+----------+----------+
3 rows in set (0.00 sec)


Хотя значение не менялось и id_person у всех одинаковый.
И такое в таблице будет встречаться много раз. Может использовать триггер, чтобы при вставке в таблицу большему значению времени всегда соответствовало большее значение id_param? Количество записей в таблице будет примерно 100 тыс. в месяц для каждой id_theme.

Во вложении пример с 3-мя записями. В таблице param я поменял primary key( dtime, id_person)->primary key(id_person, dtime).
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38384247
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет... надо просто попрощаться с использованием поля id_param (да и с самим полем - с последними уточнениями оно вообще получилось нахрен не нужное) и в t?.id_param = t1.id_param ? 1 вместо него использовать dtime .
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38384250
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, не, вру... у тебя же ж там интервалы-то неравномерные...

Тогда я бы создал процедуру (см. FAQ), которая пересчитывает это самое поле id_param так, чтобы при id_person_1 = id_person_2 из dtime_1 > dtime_2 однозначно следовало id_param_1 > id_param_2. Т.е. попросту перенумеровать записи в группах по id_person. При этом уникальность id_param в пределах таблицы нафиг не нужна, только в пределах группы.
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38384269
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь о триггере. Если вставка в таблицу идёт абы как - то да, надо триггер, который будет эту проблему фиксить. Другое дело, что каждый раз, когда что-то летит в таблицу не по порядку, устраивать в триггере перенумерацию - это бредятина.

Я бы под это дело завёл служебную табличку. В триггере просто в неё заносил значение id_person, если для него выполняется вставка с нарушением порядка. Эдакий dirty flag. Причём сначала бы проверялось наличие данного id_person в таблице грязных групп, и лишь при отсутствии - нарушение порядка. Если нарушение порядка не обнаружено - присваивал бы полю номера следующее значение, иначе (причём неважно, какое именно иначе) можно оставить пустым. При выборке соответственно смотрел, значится ли нужный id_person в списке грязных, и если да - предварительно выполнял перенумерацию. Причём только для данного id_person. При этом можно использовать и режим "грязной выборки" - т.е. наплевав на последние изменения, которые косые, зато быстро.

Плохо, что при этом в триггере фактически выполняется "ручная" генерация уникального для группы ключа. При многопользовательском доступе на корректировку/пополнение данными - будет неприятно...
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38385885
Obsess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinaа, не, вру... у тебя же ж там интервалы-то неравномерные...

Тогда я бы создал процедуру (см. FAQ), которая пересчитывает это самое поле id_param так, чтобы при id_person_1 = id_person_2 из dtime_1 > dtime_2 однозначно следовало id_param_1 > id_param_2. Т.е. попросту перенумеровать записи в группах по id_person. При этом уникальность id_param в пределах таблицы нафиг не нужна, только в пределах группы.
Я создал процедуру. Теперь id_param - порядковый номер dtime в пределах группы и из dtime_1 > dtime_2 однозначно следует id_param_1 > id_param_2. Но выполняется всё равно долго. В таблице 10 тыс. записей.
Предыдущий запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
mysql> select t1.dtime, prs.name, t1.val from param as t1 join person as prs using(id_person) join theme on theme.id_theme=prs.id_theme
    ->  where t1.val!= ifnull((select val from param as t2 where t1.id_person=t2
.id_person and t2.dtime<t1.dtime order by t2.dtime desc
 ->  limit 1),-1) and theme.name = 'plita' order by id_person, dtime;
+-------+--------+------+
| dtime | name   | val  |
+-------+--------+------+
|   255 | Ivanov |    9 |
|   375 | Ivanov |   10 |
|   388 | Ivanov |   20 |
|   400 | Ivanov |   10 |
|   401 | Ivanov | 5411 |
| 10201 | Ivanov |   11 |
|   100 | Petrov |    9 |
+-------+--------+------+
7 rows in set (2 min 37.30 sec)


Твой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
mysql> select t1.* from param t1
    -> left join param t2 on t1.val=t2.val and t1.id_person=t2.id_person and t2.id_param=t1.id_param - 1
    -> where  t2.id_param is null;
+-----------+-------+------+----------+
| id_person | dtime | val  | id_param |
+-----------+-------+------+----------+
|         1 |   388 |   20 |        6 |
|         1 |   400 |   10 |        8 |
|         1 |   375 |   10 |        2 |
|         1 |   255 |    9 |        1 |
|         2 |   100 |    9 |        1 |
|         1 | 10201 |   11 |     9009 |
|         1 |   401 | 5411 |        9 |
+-----------+-------+------+----------+
7 rows in set (3 min 36.70 sec)



Во вложении БД.
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38385889
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
explain?
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38385893
Obsess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
мне вот ещё непонятно. Ведь у меня есть первичный ключ в таблице param по (id_person, dtime).
Разве из этого не следует, что все данные в таблице уже хранятся в упорядоченном виде?
Соответсвенно, работать с ними можно как с уже отсортированными.
Тогда перенумерация записей:
Код: sql
1.
update param set id_param =(select @a:= @a + 1 from (select @a:= 0) s) order by id_person, dtime 


не должна ли быть эквивалентна? (без order by ...):
Код: sql
1.
update param set id_param =(select @a:= @a + 1 from (select @a:= 0) s)  


Таблица MyISAM.
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38385899
Obsess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrowexplain?
Для первого запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
mysql> explain select t1.dtime, prs.name, t1.val from param as t1 join person as
 prs using(id_person) join theme on theme.id_theme=prs.id_theme
    ->  where t1.val!= ifnull((select val from param as t2 where t1.id_person=t2
.id_person and t2.dtime<t1.dtime order by t2.dtime desc
    ->  limit 1),-1) and theme.name = 'plita' order by id_person, dtime;
+----+--------------------+-------+--------+---------------+---------+---------+
-----------------------+------+---------------------------------+
| id | select_type        | table | type   | possible_keys | key     | key_len |
 ref                   | rows | Extra                           |
+----+--------------------+-------+--------+---------------+---------+---------+
-----------------------+------+---------------------------------+
|  1 | PRIMARY            | theme | system | PRIMARY,name  | NULL    | NULL    |
 NULL                  |    1 | Using temporary; Using filesort |
|  1 | PRIMARY            | prs   | ALL    | PRIMARY       | NULL    | NULL    |
 NULL                  |    2 | Using where                     |
|  1 | PRIMARY            | t1    | ref    | PRIMARY       | PRIMARY | 8       |
 factory.prs.id_person |  100 | Using where                     |
|  2 | DEPENDENT SUBQUERY | t2    | index  | PRIMARY,ind   | ind     | 8       |
 NULL                  |    1 | Using where                     |
+----+--------------------+-------+--------+---------------+---------+---------+
-----------------------+------+---------------------------------+
4 rows in set (0.00 sec)


Для второго запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
mysql> explain select t1.* from param t1
    -> left join param t2 on t1.val=t2.val and t1.id_person=t2.id_person and t2.
id_param=t1.id_param - 1
    -> where  t2.id_param is null ;
+----+-------------+-------+------+---------------+---------+---------+---------
-------------+-------+-------------------------+
| id | select_type | table | type | possible_keys | key     | key_len | ref
             | rows  | Extra                   |
+----+-------------+-------+------+---------------+---------+---------+---------
-------------+-------+-------------------------+
|  1 | SIMPLE      | t1    | ALL  | NULL          | NULL    | NULL    | NULL
             | 10011 |                         |
|  1 | SIMPLE      | t2    | ref  | PRIMARY       | PRIMARY | 8       | factory.
t1.id_person |   100 | Using where; Not exists |
+----+-------------+-------+------+---------------+---------+---------+---------
-------------+-------+-------------------------+
2 rows in set (0.00 sec)
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38385936
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ObsessТвой запрос:
Мой? а почему я не в курсе?
Obsess
Код: sql
1.
7 rows in set (3 min 36.70 sec)


Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
mysql> select t1.*
    -> from param t1
    -> left join param t2
    -> on t1.val=t2.val
    -> and t1.id_person=t2.id_person
    -> and t2.id_param=t1.id_param - 1
    -> where t2.id_param is null;
+-----------+-------+------+----------+
| id_person | dtime | val  | id_param |
+-----------+-------+------+----------+
|         1 |   388 |   20 |        6 |
|         1 |   400 |   10 |        8 |
|         1 |   375 |   10 |        2 |
|         1 |   255 |    9 |        1 |
|         2 |   100 |    9 |        1 |
|         1 | 10201 |   11 |     9009 |
|         1 |   401 | 5411 |        9 |
+-----------+-------+------+----------+
7 rows in set (4 min 22.59 sec)

mysql> create index `i1` on param(id_param,id_person,val);
Query OK, 10011 rows affected (0.08 sec)
Records: 10011  Duplicates: 0  Warnings: 0

mysql> select t1.*
    -> from param t1
    -> left join param t2
    -> on t1.val=t2.val
    -> and t1.id_person=t2.id_person
    -> and t2.id_param=t1.id_param - 1
    -> where t2.id_param is null;
+-----------+-------+------+----------+
| id_person | dtime | val  | id_param |
+-----------+-------+------+----------+
|         1 |   388 |   20 |        6 |
|         1 |   400 |   10 |        8 |
|         1 |   375 |   10 |        2 |
|         1 |   255 |    9 |        1 |
|         2 |   100 |    9 |        1 |
|         1 | 10201 |   11 |     9009 |
|         1 |   401 | 5411 |        9 |
+-----------+-------+------+----------+
7 rows in set (0.03 sec)

mysql>
...
Рейтинг: 0 / 0
Как ускорить выборку
    #38387265
Obsess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Спасибо!
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как ускорить выборку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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