@mysql_ru

Страница 47 из 142
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
вопросы по postgresql задавать на @mysql_ru — это сочно, модно и молодёжно. уважаю
Ну да. Вы же узрели в запросах сплошной синтаксис конкретной СУБД, правда?

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
distinct пробывал, но он не так как надо сработал, были дублирующие строки с данными
я имею ввиду вот это: select table.id, table2.img from table inner join ( select distinct img from table2 ) as table2 on table.id = table2.img

Maxim
22.07.2017
12:50:04
ok

Andrey
22.07.2017
12:51:02
В данном случае, если table.id уникален, в резулььирующей таблице будет ровно 1 значение для каждого table.id
да ладно? вы плохо понимаете как работает mysql ) если во второй таблице будет 10 строк для id из первой таблице, то в результате будет 10 записей

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 работает

Страница 47 из 142