|
|
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Народ, добрый. Прошу помощи в решении задачки. Я программер, в sql не особо шарю. Задача: Есть две таблицы по 1`000`000 записей каждая, где храниться код и количество. Коды одинаковые, количество разное. Требуется получить код и разницу между суммой одинаковых кодов. Пример: таблица 1 таблица 2 код количество код количество 001 5 002 3 002 7 003 4 003 6 001 8 Что хочу на выходе: код разница 001 -3 002 4 003 2 Что пишу для этого, (хотя уверен, что скорее всего бред, а не запрос): SELECT `t`.`code` as `tc`, `d`.`code` as `dc`, COUNT(`t`.`count`)-COUNT(`d`.`count`) as `c` FROM `test` as `t`, `demo` as `d` GROUP BY `t`.`code`, `d`.`code` ORDER BY `t`.`code` Что получаю: А ничего не получаю, как нетрудно догадаться, сервак виснет в глухую. Куда копать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:12:34 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
hitenok, может ли быть в одной таблице один код более одного раза? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:14:42 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
да, чтобы было понятнее, кодов примерно 100. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:15:17 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
коды в пределах каждой таблицы уникальны? наборы кодов в разных таблицах совпадают или есть такие, что присутствуют только в одной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:15:36 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
коды могут не совпадать, т.е. в одной кодов может быть больше, чем в другой. Коды не уникальны, есть уникальный id. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:16:45 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
hitenokда, чтобы было понятнее, кодов примерно 100.а, ну тогда терпимо :) Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:17:37 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Проверил, или я чет не понял или #1054 - Unknown column 'sum' in 'field list' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:19:36 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
hitenok, а, оно у вас "count" называется. Ну переделайте запрос, долго, что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:30:24 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
А, ток я не понял, что на что переделать, я же пишу не силен в запросах SUM(SUM) на SUM(count)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:31:56 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
hitenok, да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:34:05 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Попробовал заменить, все работает на вид как надо, спасибо большое! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:34:54 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Можно только получить небольшой комментарий, а что дает вот это sum(case when t=1 then q else -q end) ? Я все остальное понял, а это так и не догнал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:36:15 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Немного проще: Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:39:14 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, Работает, и результат тот же, но чуть быстрее и вам спасибо, тут мне вообще весь запрос ясен, хотя сам бы я до него не додумался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:45:38 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Ребят, спасибо за помощь, реально помогли, а то я уже устал сервак перезапускать, чтобы попробовать очередной запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:52:16 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Последний вопрос, а можно ли этот запрос оптимизировать, так как выполняется он почти 2 секунды? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 13:54:59 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
не уникальный индекс (код, количество) - занимает много места, таблица дольше обновляется, но запрос считает быстро не уникальный индекс (код) - занимает меньше места, таблица чуть быстрее обновляется, но запрос считает медленнее без индекса - не занимает места под индекс, таблица обновляется быстро , но запрос считает очень долго :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 14:43:58 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, Так как все-таки можно повысить производительность именно для вывода данных из таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 14:57:25 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
hitenokТак как все-таки можно повысить производительность именно для вывода данных из таблицы?Покажите план последнего запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:01:00 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
hitenokCygapb-007, Так как все-таки можно повысить производительность именно для вывода данных из таблицы? 13.1.13. CREATE INDEX Syntax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:05:38 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
[/quot]Покажите план последнего запроса.[/quot] Это как сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:06:03 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
И таки да, miksoftПокажите план последнего запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:07:10 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
hitenokПокажите план последнего запроса. Это как сделать?хотя бы подставьте перед запросом слово EXPLAIN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:08:05 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:09:12 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
теперь еще хорошо бы увидеть, что это за индекс code в каждой из таблиц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:14:22 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Да, легко, скажи как узнать его и все напишу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:15:46 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
hitenokДа, легко, скажи как узнать его и все напишу.эх... SHOW CREATE TABLE имя_таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:16:38 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Я честно сознался в запроса и базах не силен, так что много просто не знаю, но готов делать, что надо. CREATE TABLE `test` ( `id` int(11) NOT NULL auto_increment, `code` int(11) NOT NULL, `count` int(5) NOT NULL, `created` timestamp NOT NULL default CURRENT_TIMESTAMP, UNIQUE KEY `id` (`id`), KEY `code` (`code`), KEY `count` (`count`) ) ENGINE=InnoDB AUTO_INCREMENT=274242 DEFAULT CHARSET=utf8 таблица demo аналогична этой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:20:00 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
я бы предложил создать индекс ALTER TABLE `test` ADD INDEX (`code`,`count`) для каждой из таблиц, сделать ANALYZE TABLE, аналогично, для каждой из таблиц и заново посмотреть на время и план запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:24:42 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сделал, время примерно тоже самое, т.е. нет кардинальных изменений. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:28:20 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
hitenok, Странно, предлагаемый мной индекс не подхватился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 15:56:02 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Убрал индекс с count и code в обоих таблицах, твой подхватился, но стало гораздо медленнее. id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 202 Using temporary; Using filesort 2 DERIVED test index NULL code_2 8 NULL 357884 Using index 3 UNION demo index NULL code_2 8 NULL 314322 Using index NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 16:04:21 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
miksofthitenok, Странно, предлагаемый мной индекс не подхватился.Угу, непонятно... А можно еще раз SHOW CREATE TABLE имя_таблицы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 16:05:20 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
CREATE TABLE `test` ( `id` int(11) NOT NULL auto_increment, `code` int(11) NOT NULL, `count` int(5) NOT NULL, `created` timestamp NOT NULL default CURRENT_TIMESTAMP, UNIQUE KEY `id` (`id`), KEY `code_2` (`code`,`count`) ) ENGINE=InnoDB AUTO_INCREMENT=361379 DEFAULT CHARSET=utf8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 16:06:27 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
CREATE TABLE `demo` ( `id` int(11) NOT NULL auto_increment, `code` int(11) NOT NULL, `count` int(5) NOT NULL, `created` timestamp NOT NULL default CURRENT_TIMESTAMP, UNIQUE KEY `id` (`id`), KEY `code_2` (`code`,`count`) ) ENGINE=InnoDB AUTO_INCREMENT=317929 DEFAULT CHARSET=utf8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 16:07:29 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Хммм... http://sqlfiddle.com/#!2/d2a11/2/0 Получается, что читать из покрывающего индекса для MySQL дороже, чем из таблицы? Или оптимизатор в первую очередь смотрит на длину ключа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 16:53:54 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Cygapb-007Хммм... http://sqlfiddle.com/#!2/d2a11/2/0 Там вообще забавно, для одной таблицы использует индекс code, для другой code_2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 17:05:03 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
miksoftдля одной таблицы использует индекс code, для другой code_2.Правильно, унарный минус... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 17:07:34 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
miksoftCygapb-007Хммм... http://sqlfiddle.com/#!2/d2a11/2/0 Там вообще забавно, для одной таблицы использует индекс code, для другой code_2.Да, потому что один закомментирован, а второй нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 17:07:43 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
хотя для code_2 в EXTRA указано: Using index вероятно, все же в этом случае за значением в таблицу не лезет... Но тогда тем более непонятно, почему самостоятельно выбирает code, а не code_2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 17:10:32 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Я не очень понимаю, о чем вы говорите, я чем могу помочь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 17:18:47 |
|
||
|
Подсчет разницы между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Уфф, все верно про покрывающие индексы :) Только непонятно, почему они автоматом не выбираются... Test = 393381 строк, Demo = 270341 строк http://sqlfiddle.com/#!2/0d10cb/3 Key(Code): Record Count: 4; Execution Time: 2045ms Key(Code,Count): Record Count: 4; Execution Time: 451ms Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 18:11:15 |
|
||
|
|

start [/forum/topic.php?all=1&fid=47&tid=1836024]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 415ms |

| 0 / 0 |
