Въпрос за SQL заявка

5 отговора 415 прегледа
#1

Въпрос за SQL заявка

Значи става въпрос за следната заявка :

select unix_timestamp(v.dt) as date, v.size as io, v2.size as ii, v3.size as po, v4.size as pi, v5.size as lo, v6.size as li from traffic3 v right join traffic3 v2 on unix_timestamp(v.dt)=unix_timestamp(v2.dt) right join traffic3 v3 on unix_timestamp(v.dt)=unix_timestamp(v3.dt) right join traffic3 v4 on unix_timestamp(v.dt)=unix_timestamp(v4.dt) right join traffic3 v5 on unix_timestamp(v.dt)=unix_timestamp(v5.dt) right join traffic3 v6 on unix_timestamp(v.dt)=unix_timestamp(v6.dt) where v.dt>(now()-interval 5 minute) and v.proto = '0' and v2.proto = '1' and v3.proto = '2' and v4.proto = '3' and v5.proto = '4' and v6.proto = '5';

Структура на таблицата :
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| dt | datetime | YES | MUL | NULL | |
| proto | tinyint(4) | YES | MUL | NULL | |
| size | int(11) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+

Вид на данните вътре :
+---------------------+-------+-----------+
| dt | proto | size |
+---------------------+-------+-----------+
| 2005-03-19 00:53:01 | 0 | 23424729 |
| 2005-03-19 00:53:01 | 2 | 182869303 |
| 2005-03-19 00:53:01 | 4 | 58028640 |
| 2005-03-19 00:53:01 | 1 | 32068904 |
| 2005-03-19 00:53:01 | 3 | 454193095 |
| 2005-03-19 00:53:01 | 5 | 779796850 |
+---------------------+-------+-----------+

Та въпросът е следният :
Изпулнено на ръка видимо няма як лоад на SQL-a, но така конструирана заявката бива ли я.И възможно ли е да се затрудни ако в таблицата има доста записи но винаги само 6 от тях са с еднаква дата и само 6 от тях се включват в този интервал.

Отговор
в отговор на Frodo #2

Re: Въпрос за SQL заявка

Махни всички функции или изрази които изчисляват нещо от колонките защото в такъв случай индексите не работят.

Ето това например е абсолютно безсмислено:

unix_timestamp(v.dt)=unix_timestamp(v6.dt)


Точно същия резултат ще получиш и с

v.dt = v6.dt

което обачеможе да използва индекс

И изобщо щом си с MySQL както изглежда питай EXPLAIN

Освен това когато питаш нещо пращай структурата таблиците си със SHOW CREATE TABLE

В резултата от DESCRIBE се вижда, че имаш някакви индекси ама какви не е ясно.

salle.online.bg/sig
Отговор
в отговор на Frodo #3

Re: Между другото ...

Защо ти е RIGHT JOIN в случая? Нещо не схващам логиката

salle.online.bg/sig
Отговор
в отговор на salle #4

Re: Между другото ...

Данните са в 6 колонки и респективно ги връща на 6 реда е там е работата че ги искам на един единствен.

Ето таблицата:
traffic3 | CREATE TABLE `traffic3` (
`dt` datetime default NULL,
`proto` tinyint(4) default NULL,
`size` int(11) default NULL,
KEY `dt` (`dt`),
KEY `proto` (`proto`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251



Конструирах си го както каза и резултатът е удивителен, ама като незнах че се губи индекса. Сега направо лети.

Редактирано от Frodo на

Отговор
в отговор на Frodo #5

Re: ?

А защо не го направищ с един ред с IF() ?

salle.online.bg/sig
Отговор
в отговор на salle #6

Re: ?

Да си кажа честно - защото незнам много за тази функция.Ако дадеш малко инфо и УМ :) ще съм благодарен.

Отговор