
?
23.08.2017
09:11:07

f4rt~
23.08.2017
09:15:14

F01134H
23.08.2017
09:16:22
ох уж этот Problem Exists Between Keyboard And Chair

Kirill
23.08.2017
09:30:21
EXPLAIN EXTENDED SELECT
DATE_FORMAT(created, '%Y-%m-%d') AS `date`,
COUNT(*) AS `clicks`
FROM
clicks
WHERE
`partner_id` = 'afftiny' AND `created` BETWEEN '2017-08-13' AND '2017-08-24'
GROUP BY
`date`
ORDER BY
`clicks`
DESC
почему при таком запросе на таблице с 2.3кк данных время выполнения 4-7 секунд ?
эксплейн и схема внутри https://pastebin.com/CiDQpUke

Google

Kirill
23.08.2017
09:30:45
mysql 5.5.50
в mariadb всё ок

Sergey
23.08.2017
09:31:12
> Using where; Using temporary; Using filesort

Kirill
23.08.2017
09:31:30
индекс есть, как исправить?

Sergey
23.08.2017
09:31:38
индекс на что?)

Kirill
23.08.2017
09:32:03
на оба поля, partner_id, created

Sergey
23.08.2017
09:32:44
clicks

Ильдар
23.08.2017
09:33:02
Вот если бы ты все даты засунул в IN, было бы лучше
И, может попробовать сделать составной индекс (partner_id, created, date, clicks)

Dmitro
23.08.2017
09:34:38
пробуй методом исключения. убери count(*), потом group by

Sergey
23.08.2017
09:35:29

Google

Art
23.08.2017
09:36:06
Норм для тектовой строки которая поместится в mysql а далее вывод в формате json где нужно отдавать как единую строку без \r\n. Или есть более элегантный подход к фильтрации параметров?
// для этого: secureArrParams([$_POST['p'], $_POST['p2'], $_POST['p3']])
private function secureArrParams($arr) {
$ln = count($arr);
while($ln--) {
$arr[$ln] = trim($arr[$ln]);
$arr[$ln] = nl2br($arr[$ln]);
$arr[$ln] = htmlspecialchars($arr[$ln]);
$arr[$ln] = addslashes($arr[$ln]);
$arr[$ln] = str_replace("\r\n", "", $arr[$ln])
}
return $arr;
}

Dmitro
23.08.2017
09:36:07
count() на innodb довольно медленный. хотя на 2.3к не должно быть проблемой

Sergey
23.08.2017
09:36:25
2.3kk насколько я понял
и тут проблема именно в фулскан

Kirill
23.08.2017
09:36:46
2.3kk

Sergey
23.08.2017
09:36:48
и потом еще и сортировка результата

Kirill
23.08.2017
09:37:12
сортировка не обязательна, просто был запрос, где только с сортировкой начинал исопльзоаться индекс

Sergey
23.08.2017
09:37:22
и prepared statements
возвращайся только как дочитаешь и разберешься

Art
23.08.2017
09:37:49
так потом и в pdo через prepare
->execute([p1, p2])

Kirill
23.08.2017
09:38:11
вот как раз этот запрос
SELECT
`phone`,
COUNT(*) AS subscriptions
FROM
`users`
WHERE
`status` IN('active', 'finished') AND `created` BETWEEN '2017-08-19 00:00:00' AND '2017-08-21 00:00:00'
GROUP BY
phone
HAVING
subscriptions >= 3
ORDER BY
subscriptions
DESC

Sergey
23.08.2017
09:39:00

Art
23.08.2017
09:39:40
я в ручную json собираю, отправляю заголовок и сам echo json

Sergey
23.08.2017
09:44:52

Oscar
23.08.2017
09:45:10
видимо у тебя много свободного времени)

Art
23.08.2017
09:45:12
Норм для тектовой строки которая поместится в mysql а далее вывод в формате json где нужно отдавать как единую строку без \r\n. Или есть более элегантный подход к фильтрации параметров?
// для этого: secureArrParams([$_POST['p'], $_POST['p2'], $_POST['p3']])
private function secureArrParams($arr) {
$ln = count($arr);
while($ln--) {
$arr[$ln] = trim($arr[$ln]);
$arr[$ln] = nl2br($arr[$ln]);
$arr[$ln] = htmlspecialchars($arr[$ln]);
$arr[$ln] = addslashes($arr[$ln]);
$arr[$ln] = str_replace("\r\n", "", $arr[$ln])
}
return $arr;
}

Kirill
23.08.2017
09:50:20
SELECT
COUNT(*)
FROM
clicks
WHERE
`partner_id` = 'afftiny' AND `created` BETWEEN '2017-08-13' AND '2017-08-24'
вобщем этот запрос работает столькоже долго, значсит проблема в between, нужно иначе даты фильтровать
хз как -_-

Google

Kirill
23.08.2017
09:51:47
без between работает моментально

Андрэ
23.08.2017
09:52:17
если промежутки дат небольшие, может и правда where in?

Kirill
23.08.2017
09:54:09
я филтрую по дате, а в таблице у меня datetime
для in нужно ведь полное совпадение
мб like тогда ?)

Magnus
23.08.2017
09:54:45
А от datetime в сторону timestamp избавиться нельзя?

Kirill
23.08.2017
09:55:25
нет времени на это скорее
рефакторинг не уместен, т.к. проект и так под снос давно пора

Magnus
23.08.2017
09:56:06
что explain пишет?

Mikhail
23.08.2017
09:56:22
А разница? Как вариант сделать ещё одно поле date от created

Kirill
23.08.2017
09:56:39
explain на счётчик с between?

Mikhail
23.08.2017
09:56:45
Я про datetime и timestamp

Art
23.08.2017
09:56:53
а сейчас в mysql что популярно, процедуры вызывать или из приложения запросы слать?

Mikhail
23.08.2017
09:57:20
Процедуры зло нетестируемое

Magnus
23.08.2017
09:57:23

Art
23.08.2017
09:57:31
мне тоже лично обычные запросы удобно

Kirill
23.08.2017
09:57:35
https://pastebin.com/CiDQpUke

Sergey
23.08.2017
09:57:36

Mikhail
23.08.2017
09:58:13
Заодно может кто расскажет как тестируют процедуры

Art
23.08.2017
09:58:23
а сложные запросы можно через orm составлять? или там только crud?

Google

Яўген
23.08.2017
09:59:09
процедуры плохи тем, что шардинг уже не реализовать без большого оверхеда

Sergey
23.08.2017
09:59:23

Яўген
23.08.2017
09:59:34
по поводу запроса: попробуй составной индекс на partner_id, created поставить

Sergey
23.08.2017
09:59:41
шардинг это как последнее что стоит делать
когда уже все остальное перепробовал

Яўген
23.08.2017
10:00:15
нет, там 2 отдельных

Art
23.08.2017
10:00:18
и кажется процедуры по-моему не экспортируются в одном в файле с данными
не очень удобно

Яўген
23.08.2017
10:01:15
но индекс для фильтра поможет, filesort и temporary останутся

Magnus
23.08.2017
10:01:50
https://pastebin.com/CiDQpUke
Накакого криминала не вижу. Я бы создал поле с timestamp создания записи, старые бы обновил из created и делал выборку по нему. По идее, должно быть быстрее

Sergey
23.08.2017
10:01:52
ну то есть если ты выбрал процедуры то работать можно и есть масса инструментов
просто это "по другому"
как же я люблю postgres)

Андрэ
23.08.2017
10:04:26

Sergey
23.08.2017
10:04:52
брутально

Sergey
23.08.2017
10:05:04
SqlYog есть)

Google

Андрэ
23.08.2017
10:05:19

Sergey
23.08.2017
10:05:28
да

Андрэ
23.08.2017
10:05:36
ну так то да)

Яўген
23.08.2017
10:05:45
деплой хранимых процедур происходит гораздо сложнее

Sergey
23.08.2017
10:05:48
ну а мне больше ничего и не надо особо.

Яўген
23.08.2017
10:05:52
там гитом не воспользуешься
надо дропать сначала, и только потом новую создавать

Sergey
23.08.2017
10:06:05

Андрэ
23.08.2017
10:06:07

Kirill
23.08.2017
10:06:44
составной индекс начальный запрос ускорил, теперь 2 секунды работает

Sergey
23.08.2017
10:06:46

Яўген
23.08.2017
10:06:51
было время, когда писал на дельфи, поэтому делали логику приложения в основном на хранимых процедурах. Пытался потом переносить это на php, кучу проблем слоивл

Sergey
23.08.2017
10:06:51
есть масса инструментов упрощающих это добро

Mikhail
23.08.2017
10:06:56

Sergey
23.08.2017
10:07:15

Mikhail
23.08.2017
10:07:22
)

Sergey
23.08.2017
10:07:23
я процедуры принципиально не юзаю

Mikhail
23.08.2017
10:07:31
Я тоже)

Яўген
23.08.2017
10:08:18

Patrik
23.08.2017
10:08:36

Kirill
23.08.2017
10:09:48
@masterjus было 4-7 секунд, сейчас добавилось исопльзования индекса

Яўген
23.08.2017
10:10:32
filesort и temporary table останутся, этого не избежать при группировке и сортировке