
Fike
21.07.2017
16:18:03
вот именно, что удобно - это когда в одной таблице
потому что если их сотня, то как ты будешь подсчитывать общее количество статей
делать поиск
и вообще работать с ними всеми

Google

Ринат
21.07.2017
16:18:56
сделал такую штуку из за ошибки что места кончилось
https://stackoverflow.com/questions/730579/error-1114-hy000-the-table-is-full
теперь /etc/init.d/mysql: ERROR: The partition with /var/lib/mysql is too full!
т.е как та директива должна была повлиять на место?

Fike
21.07.2017
16:19:46
дИректива

Ринат
21.07.2017
16:20:15
innodb_data_file_path = ibdata1:10M:autoextend:max:512M

Fike
21.07.2017
16:20:16
если внимательно почитать, то будет видно, что на место она не влияет никак, только на ограничения и способ хранения

Ринат
21.07.2017
16:20:25
так то у меня там per_table было изначально

Fike
21.07.2017
16:20:46
так это ты зря ее включил значит

Ринат
21.07.2017
16:20:51
я же не могу увеличтть место удалением
innodb_data_file_path = ibdata1:10M:autoextend:max:512M это добавил и решил рестартануть

Google

Fike
21.07.2017
16:21:16
проверь сколько вообще места на диске

Ринат
21.07.2017
16:21:50
0
может логи можно удалить у мускулуа?
или они тоже завязаны
на работу бд

Fike
21.07.2017
16:22:18
так может сначала места подосвободить, а потом вводить непонятно что из интернета?
если обычные логи, то их можно смело убивать, но они и так у тебя ротироваться должны
если бинлоги репликации, то зависит от того, сожрала ли их реплика, но там тоже есть настройка ротации
выясни что вообще место у тебя жрет

Ринат
21.07.2017
16:26:29
в var/lib чото много
собственно сфинкса и mysql
513 ib_logfile1
513 ib_logfile0
их же вроде нельзя трогать?
нашёл в tmp
какой то здец, спасибо

Subb98
22.07.2017
04:33:02
Доброго утра всем. Подскажите, возможно ли передать алиас в подзапрос?
UPDATE table1 AS t1
SET var1 = subq.sum
FROM (
SELECT ...
FROM ...
JOIN ...
JOIN ...
WHERE some.id = t1.id AND ... // верещит на t1
) AS subq;

Danil
22.07.2017
04:44:46
Вложенный запрос выполняется раньше чем Update, Select и т.д. (в прочим как и все сто до from стоит).

Subb98
22.07.2017
04:49:33
Понял, благодарю. =)
@DQGmI , можете подсказать по конкретному запросу? Проблема такая, что я пытаюсь сделать следующий update запрос:
UPDATE base_organisation AS bo
SET games_turnover_month = sub.sum FROM (
SELECT bg.id, SUM(bg.revenue / opg.count) AS sum
FROM base_game AS bg
JOIN tmp_fk_games_organisations AS fk on fk.game_id = bg.id
JOIN tmp_orgs_per_game AS opg on opg.game_id = bg.id
WHERE bg.website IS NOT NULL AND bg.monetizations ? 'free2play'
GROUP BY bg.id
) AS sub;
Он должен вернуть сумму поля revenue из таблицы base_game для каждой base_organisation. Связь определяется через таблицу tmp_fk_game_organisations. Если я буду в подзапросе возвращать одно поле, сумму, то сумма будет всегда одинаковой для всех организаций. Если я возвращаю, как сейчас, два поля, то запрос выполняется очень долго.

Google

Subb98
22.07.2017
05:11:03
SELECT DISTINCT game_id, org_id FROM (--INTO TEMPORARY tmp_fk_games_organisations
SELECT
bg.id AS game_id,
bo.id AS org_id
FROM base_game AS bg
JOIN fk_games_developers AS fkd ON bg.id = fkd.basegame_id
JOIN base_organisation AS bo ON fkd.baseorganisation_id = bo.id
UNION
SELECT
bg.id AS game_id,
bo.id AS org_id
FROM base_game AS bg
JOIN fk_games_publishers AS fkp ON bg.id = fkp.basegame_id
JOIN base_organisation AS bo ON fkp.baseorganisation_id = bo.id
) AS subquery
ORDER BY game_id, org_id;
SELECT game_id, count(*) as count FROM tmp_fk_games_organisations as bg GROUP BY game_id;
Это подзапросы

Danil
22.07.2017
05:14:41
@Subb98 я попробую чуть чуть по позже посмотреть. Но я не спец в mysql и тем более в его оптимизации:( (пока только union в глаза бросился....)

Subb98
22.07.2017
05:14:57
Спасибо =)
Тут даже не в оптимизации проблема. Это выполняется так долго, что я не могу дождаться окончания запроса.
А таблица не такая большая.

Danil
22.07.2017
05:20:17
А не могли бы explain вашего запроса сделать?


Subb98
22.07.2017
05:25:27
Да, конечно
Update on base_organisation bo (cost=35169.07..139919.38 rows=6133758 width=1259)
-> Nested Loop (cost=35169.07..139919.38 rows=6133758 width=1259)
-> Seq Scan on base_organisation bo (cost=0.00..12742.62 rows=103962 width=1215)
-> Materialize (cost=35169.07..35170.54 rows=59 width=44)
-> Subquery Scan on sub (cost=35169.07..35170.25 rows=59 width=44)
-> HashAggregate (cost=35169.07..35169.66 rows=59 width=12)
Group Key: bg.id
-> Hash Join (cost=30561.27..34566.80 rows=60227 width=20)
Hash Cond: (fk.game_id = bg.id)
-> Seq Scan on tmp_fk_games_organisations fk (cost=0.00..3178.50 rows=220350 width=4)
-> Hash (cost=30560.60..30560.60 rows=54 width=24)
-> Hash Join (cost=27679.67..30560.60 rows=54 width=24)
Hash Cond: (opg.game_id = bg.id)
-> Seq Scan on tmp_orgs_per_game opg (cost=0.00..2301.28 rows=154428 width=12)
-> Hash (cost=27678.94..27678.94 rows=59 width=12)
-> Seq Scan on base_game bg (cost=0.00..27678.94 rows=59 width=12)
Filter: ((website IS NOT NULL) AND (monetizations ? 'free2play'::text))


Alexey
22.07.2017
05:31:51
Да, конечно
вопросы по postgresql задавать на @mysql_ru — это сочно, модно и молодёжно. уважаю

Subb98
22.07.2017
05:34:44

Alexey
22.07.2017
05:36:13
я узрел вывод explain из постгреса. И очевидно, что на вопросы "почему медленно?" и "как сделать лучше?" лучше ответят на @pgsql. Потому что ответы сильно зависят от используемой СУБД и опыта людей в конкретной СУБД

Subb98
22.07.2017
05:37:19
Ну ОК. Я грешу на свои руки, а не на СУБД в силу отвутствия опыта в сложных запросах. Поэтому вряд ли тут играет роль СУБД.

Maxim
22.07.2017
11:51:46
Делаю join запрос, в запросе есть одна таблица из множеств других в запросе с массивом данных. Можли получить только один элемент из этой таблицы. Тоесть есть пост и изображения к посту, так же другие данные, вот надо получить только одну картинку к этому посту

Dmitriy
22.07.2017
11:55:16
после select напишите только имя интересующего поля
хорошим тоном в конце LIMIT 1 поставить, если точно ожидается только единственное значение

Maxim
22.07.2017
12:05:43
У меня такая ситуация что надо получить 10 вариантов, и одна таблица из множеств других содержит массив данных, а мне надо из этой таблицы получить только один вариант так как остальные таблицы в запросе содержат по одному варианту, а эта таблица портит картину
SELECT table1.id, table2.img FROM table1, table2 WHERE table2.img=table1.id LIMIT 10;
вот картинок содержиться много по id и получается массив, а мне надо получить по одной картинки на один id

Danil
22.07.2017
12:30:34
Group by id

Google

Danil
22.07.2017
12:35:28
Либо таблицу от куда надо только 1 значение из множества достать, и остальные таблицы будут давать ровно по 1 значению на какой то конкретный id (id уникальный), подключить таблицу с картинками left join, в условии on указать как хочешь отобрать по 1 му значению.

Andrey
22.07.2017
12:38:00
а разве left join спасет?
а группировку если и делать, то, возможно, лучше будет исходную таблицу с подзапрос засунуть и там делать группировку (хотя здесь distinct понятнее будет), чтобы лишние данные туда-сюда не гонять

Danil
22.07.2017
12:44:08
Ну Джоин отдаст по 1 му значению из присоединяемой таблици для каждой строки исходной таблици

Andrey
22.07.2017
12:45:35
нет, не так, он отдаст ровно столько, сколько подходит под условие,
условие есть, по нему уже больше отдает, значит left join так же отдаст больше

Maxim
22.07.2017
12:46:57
Попробую Group by id

Danil
22.07.2017
12:47:07
SELECT
table.id, table2.img
FROM
table1,
LEFT JOIN
table2
ON
table1.id =table2.img

Maxim
22.07.2017
12:47:50
distinct пробывал, но он не так как надо сработал, были дублирующие строки с данными

Andrey
22.07.2017
12:48:10
сейчас inner join - он строже left join'а, и он отдает больше 1 записи

Danil
22.07.2017
12:48:26
В данном случае, если table.id уникален, в резулььирующей таблице будет ровно 1 значение для каждого table.id

Andrey
22.07.2017
12:49:39

Maxim
22.07.2017
12:50:04
ok

Andrey
22.07.2017
12:51:02

Danil
22.07.2017
12:51:48
Вот теперь я начал сомневаться. Я действительно не очень хорошо знаю mysql... надо будет проверить

Andrey
22.07.2017
13:01:02
https://dev.mysql.com/doc/refman/5.7/en/nested-loop-joins.html - здесь написано как join работает