powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / почему такая большая разница с MySQL ?
30 сообщений из 30, показаны все 2 страниц
почему такая большая разница с MySQL ?
    #39610275
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗАПРОС:
Код: sql
1.
select * from logs where uid=3 order by added limit 50;



у мускуля он мгновенно выполняется, а у ПГ - 4сек (Карл!)
почему-то ПГ не использует индекс на uid, если правильно понял?
(индексы стоят на обоих полях)

PG:
Код: php
1.
2.
3.
4.
5.
6.
7.
 Limit  (cost=0.43..1749.70 rows=50 width=127) (actual time=3902.616..4044.502 rows=50 loops=1)
   ->  Index Scan using logs_added_idx on logs  (cost=0.43..58705.95 rows=1678 width=127) (actual time=3902.610..4044.432 rows=50 loops=1)
         Filter: (uid = 3)
         Rows Removed by Filter: 652848
 Planning time: 0.554 ms
 Execution time: 4044.665 ms
(6 rows)



MY:
Код: php
1.
2.
3.
4.
5.
6.
+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+---------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref   | rows | filtered | Extra                                 |
+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+---------------------------------------+
|  1 | SIMPLE      | logs  | NULL       | ref  | uid           | uid  | 2       | const |  837 |   100.00 | Using index condition; Using filesort |
+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+---------------------------------------+
1 row in set, 1 warning (0,03 sec)
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39610279
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
индекс у ПГ работает, только если сортировки нет
тогда тоже мгновенно - 40мс
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39610284
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если только сортировку оставить, то тоже мгновенно
непонятно, почему нельзя из получившегося отсортированного списка просто набрать 50 штук с uid=3, почему надо ВЕСЬ список пробегать
планировщик чтоли под кайфом писали
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
explain analyze select * from logs order by added limit 50;
                                                               QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.43..3.06 rows=50 width=127) (actual time=0.582..0.669 rows=50 loops=1)
   ->  Index Scan using logs_added_idx on logs  (cost=0.43..56047.21 rows=1064383 width=127) (actual time=0.579..0.617 rows=50 loops=1)
 Planning time: 0.396 ms
 Execution time: 0.763 ms
(4 rows)



хештег: #разочарование
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39610285
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78,

20797330

не оно ?

ещё недавно натыкался, что он даже когда--то было унутре, но его выпилили
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39610286
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78,

сделайте составной и не парьтесь.
или пихайте на нужный план руками. (паттернов уже много наработано)

пока планирование -- не самая сильная сторона, читайте про чудеса хенджоба . макс составляет подборки.
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39610287
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
факультативно: недавно пытался заставить работать типа через мердж по условию

Код: sql
1.
select a,b from t where not exists (SELECT 1 from t t1 where t.a=t1.a and t.b<>t1.b)



одним маленьким довеском. b=F(a). так и не сообразил, действительно ли хеш-анти, на который оно сваливалось, теоретицки шустрее мерджа по иос-у.

надо без ф-й зависимости погонять, видимо.
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39610291
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqtip78,

сделайте составной и не парьтесь.
едрический конь!
Код: php
1.
2.
3.
4.
5.
6.
 Limit  (cost=0.43..144.68 rows=50 width=127) (actual time=0.330..0.668 rows=50 loops=1)
   ->  Index Scan using logs_uid_added_idx on logs  (cost=0.43..4841.47 rows=1678 width=127) (actual time=0.083..0.349 rows=50 loops=1)
         Index Cond: (uid = 3)
 Planning time: 2.207 ms
 Execution time: 0.832 ms
(5 строк)


там фишка в том, что uid находится в самом конце миллионного списка, т.е. он только в последних днях есть
т.е. если сортировка обычная, то долго, а если с DESC, то долго только в 1й раз
Но мускуль то как-то сумел разобраться с этим!

это блин если понадобится какой-то новый запрос, а планировщик тупит, то пиши новый индекс и переписывай все другие запросы под этот индекс, потому что там вторая колонка не участвует...
потому что если в индексе колонки местами поменять, то будет уже так:
Код: php
1.
2.
3.
4.
5.
6.
 Limit  (cost=0.43..813.68 rows=50 width=127) (actual time=39.608..40.071 rows=50 loops=1)
   ->  Index Scan using logs_added_uid_idx on logs  (cost=0.43..27293.34 rows=1678 width=127) (actual time=39.587..40.001 rows=50 loops=1)
         Index Cond: (uid = 3)
 Planning time: 1.603 ms
 Execution time: 40.221 ms
(5 строк)


однако ниху* себе!

или пихайте на нужный план руками. (паттернов уже много наработано)

пока планирование -- не самая сильная сторона, читайте про чудеса хенджоба . макс составляет подборки.
а где паттерны можно глянуть?
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39610293
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а может и не надо переписывать...
Код: php
1.
2.
3.
4.
5.
6.
 Limit  (cost=0.43..144.68 rows=50 width=127) (actual time=0.084..0.238 rows=50 loops=1)
   ->  Index Scan using logs_uid_added_idx on logs  (cost=0.43..4841.47 rows=1678 width=127) (actual time=0.078..0.184 rows=50 loops=1)
         Index Cond: (uid = 3)
 Planning time: 0.239 ms
 Execution time: 0.301 ms
(5 строк)
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39610294
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это был
Код: sql
1.
select * from logs where uid=3 limit 50;
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39610297
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78,

по ссылке выше
хотя там случай более сложный, чем вам надо

при некоторых условиях на мощности мн-в
вместо :

Код: sql
1.
select * from logs where uid=3 order by added limit 50;



надо писать примерно так :
Код: sql
1.
2.
3.
with d3 as (
select * from logs where uid=3 /*order by added limit 50;*/
) SELECT * from d3 order by added limit 50 



а когда -- это надо выяснять по статистикам.
если же мощности устроены плохо -- то нужно строить нкжные индексы.
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39610308
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqнадо писать примерно так :
Код: sql
1.
2.
3.
with d3 as (
select * from logs where uid=3 -- order by added limit 50;
) SELECT * from d3 order by added limit 50 



а когда -- это надо выяснять по статистикам.
если же мощности устроены плохо -- то нужно строить нкжные индексы.

ну понятно, аля имитация индекса, который должен вот так работать, но планировщик был пьян.
а что, будет даже лучше, чем составной индекс?
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39610523
jan2ary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78,

У мускуля кеш запросов отключен?
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39610878
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jan2arytip78,

У мускуля кеш запросов отключен?
походу да
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| Qcache_free_blocks      | 1       |
| Qcache_free_memory      | 1031832 |
| Qcache_hits             | 0       |
| Qcache_inserts          | 0       |
| Qcache_lowmem_prunes    | 0       |
| Qcache_not_cached       | 652155  |
| Qcache_queries_in_cache | 0       |
| Qcache_total_blocks     | 1       |
+-------------------------+---------+
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39613964
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqпока планирование -- не самая сильная сторона, читайте про чудеса хенджоба . макс составляет подборки.
читаю его пдф-ку...
а вот в этом примере разве нельзя было использовать массивы?
Код: sql
1.
2.
3.
4.
5.
6.
EXPLAIN ANALYZE SELECT (_row).* FROM (
SELECT (
   SELECT test FROM test WHERE test.author=t.author ORDER BY rating DESC LIMIT 1
) AS _row
FROM (VALUES (29),(68),(45),(47),(50),(41),(11),(4),(83),(60)) AS t(author)
OFFSET 0) as _t;



как-то так:
Код: sql
1.
EXPLAIN ANALYZE SELECT * FROM test WHERE author = ANY (ARRAY[29,68,45,47,50,41,11,4,83,60]) ORDER BY rating DESC LIMIT 1;



?
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39614019
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78,

если несколько значений, то можно. если десятки и сотни, то лучше через VALUES, т.к. это даёт больше возможностей для построения плана и, как правило, лучшую производительность.
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39614064
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78qwwqпока планирование -- не самая сильная сторона, читайте про чудеса хенджоба . макс составляет подборки.
читаю его пдф-ку...



о, где мне взять эту пдфку?
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39614484
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинtip78пропущено...

читаю его пдф-ку...



о, где мне взять эту пдфку?
https://pgday.ru/files/pgmaster14/max.boguk.query.optimization.pdf
https://pgday.ru/ru/2017/papers
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39614499
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как второй вариант привести к первому варианту, т.е. чтобы он автоматом находил все телефоны по ID (их там может быть несколько), а потом делал как во втором варианте?
второй в-т быстрее первого почти в 100 раз ("array[cn,code,num]" в левой части очень тормозит)
Код: sql
1.
2.
3.
4.
WITH sub AS (SELECT array[cn,code,num] AS p FROM phones WHERE type=2 AND id=57439)
SELECT id FROM phones WHERE type=1 AND array[cn,code,num] = ANY(SELECT p FROM sub);

SELECT id FROM phones WHERE type=1 AND ((cn,code,num) = (7,966,3126798) OR (cn,code,num) = (7,499,1204168) OR (cn,code,num) = (7,999,9858801)) GROUP BY id;



к слову, так он уже не понимает:
Код: sql
1.
2.
3.
4.
5.
SELECT id FROM phones WHERE type=1 AND ((cn,code,num) = ((7,966,3126798) OR (7,499,1204168) OR (7,999,9858801)));

ОШИБКА:  аргумент конструкции OR должен иметь тип boolean, а не record
СТРОКА 1: ...id FROM phones WHERE type=1 AND ((cn,code,num) = ((7,966,312...
                                                               ^



и вот так пытался:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT(
select id from phones t1 where (t1.cn,t1.code,t1.num) = t2.ph
) AS _row
FROM (VALUES (7,966,3126798),(7,499,1204168),(7,999,9858801)) AS t2(ph) OFFSET 0;

ОШИБКА:  оператор не существует: record = integer
СТРОКА 2: ...elect id from phones t1 where (t1.cn,t1.code,t1.num) = t2.ph
                                                                  ^
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39614655
bdsm_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
select id from phones where type = 1 and (cn, code, num) = any(select cn, code, num from phones where type = 2) group by id
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39614689
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о, спасиб, ларчик просто открывался )
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39615346
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как быть, когда WHERE зависит от условий и нужно, например, набрать условий в массив, а потом из них сгенерить WHERE разом ?
чё-то я и в функциях такого даже не нашёл
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39615356
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78а как быть, когда WHERE зависит от условий и нужно, например, набрать условий в массив, а потом из них сгенерить WHERE разом ?
чё-то я и в функциях такого даже не нашёл
это был топик про планирование. пусть так и будет.


хинт: для топика про синтакс на форуме ещё осталось место.

пысы: по вопр. : -- от динамо до bool_and/or и т.п. распишите проблему в отдельном топике -- авось кто не поленится за вас пролистать странички ФМ
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39615385
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqtip78а как быть, когда WHERE зависит от условий и нужно, например, набрать условий в массив, а потом из них сгенерить WHERE разом ?
чё-то я и в функциях такого даже не нашёл
это был топик про планирование. пусть так и будет.


хинт: для топика про синтакс на форуме ещё осталось место.

пысы: по вопр. : -- от динамо до bool_and/or и т.п. распишите проблему в отдельном топике -- авось кто не поленится за вас пролистать странички ФМ
да я и сам не поленюсь, а что за ФМ, и где эти странички?
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39615395
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39615398
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, нашёл в вашем примере такой в-т:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT * FROM (
SELECT * FROM t_t 

ORDER BY fld
LIMIT 30 +(SELECT count(1) FROM public.t_t  
	WHERE
		fld = (SELECT fld from (SELECT fld FROM public.t_t ORDER BY 1 LIMIT 30) last ORDER BY fld desc LIMIT 1)
		OR ( fld IS NULL AND (SELECT fld from (SELECT fld FROM public.t_t ORDER BY 1 LIMIT 30) last ORDER BY fld desc LIMIT 1)
			IS NULL
		)
	)
) buff
ORDER BY fld,t_id limit 30



т.е. можно из таблицы насобирать

зы: новая тема вроде как и не нужна, вопрос то почти решённый
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39615403
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqtip78,
fucking manual
https://www.postgresql.org/docs/9.6/static/index.html
то же, для слабовидящих:
https://postgrespro.ru/docs/postgresql/9.6/index.html
во1, не хами
во2, https://postgrespro.ru/docs/postgresql/ 10 /functions-array.html
в3, открыто в соседней вкладке
и в4, форум нужен как раз, чтобы не листать 2000 страниц мануала в поисках нужного слова.
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39615405
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78кстати, нашёл в вашем примере такой в-т:


гм вы с синтаксом боретесь (его незнанием), или про правильное его использование с т.з. оптимального инструктажа планеру ?

это настолько 2 разных вопроса, что тут смешанные вместе создают впечатление легкой неадекватности смешивающего.
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39615414
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78qwwqtip78,
fucking manual
https://www.postgresql.org/docs/9.6/static/index.html
то же, для слабовидящих:
https://postgrespro.ru/docs/postgresql/9.6/index.html
во1, не хами
во2, https://postgrespro.ru/docs/postgresql/ 10 /functions-array.html
в3, открыто в соседней вкладке
и в4, форум нужен как раз, чтобы не листать 2000 страниц мануала в поисках нужного слова.
во первых не хами те, мальтчик
во вторых если читаешь ФМ уже не 1-й год, то разница в в версиях -- мелочь, а болдом по голове себе постучи

3 а раз открыто -- так сиди, читай
4 т.е. это ленивым мальчикам он нужен для этого. мне -- нет. именно поэтому и было рекомендовано завести топик про синтакс и ждать там благодетеля
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39615444
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в зеркале мальчика увидишь, шкет.
"те" тебе уже не светит, пока не извинишься
перешёл на личности, так не удивляйся.
значит тебе форум нужен, чтобы пофлудить в темах и повыёживаться? ну отличное занятие для юного тельца, ищущего признания у подружек, но свали плиз из моей темы, раз тебе сказать по сути нечего.
...
Рейтинг: 0 / 0
почему такая большая разница с MySQL ?
    #39615454
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78,

попей те водички
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / почему такая большая разница с MySQL ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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