Mysql Как оптимизировать небольшой запрос?

frenzy

Новичок
Разбираюсь с MYSQL, интересует такой вопрос.
Есть запрос:
Код:
SELECT
            DATE_FORMAT(`birthday`, '%d') as `day_of_birth`,
            DATE_FORMAT(`birthday`, '%m') as `month_of_birth`,   
            FROM `users` WHERE 1 LIMIT 0 , 5
Если я введу переменную и сделаю его так:
Код:
set @curbirthday=0;           
SELECT
            DATE_FORMAT(@curbirthday:=`birthday`, '%d') as `day_of_birth`,
            DATE_FORMAT(@curbirthday, '%m') as `month_of_birth`,   
            FROM `users` WHERE 1 LIMIT 0 , 5
То нагрузка снизиться (при условии, что база очень большая)? И может можно как-то поумнее его записать не вызывая 2 раза DATE_FORMAT?
 

WMix

герр M:)ller
Партнер клуба
То нагрузка снизиться (при условии, что база очень большая)?
думаю что нет, но и на таких мелочах не стоит себя растрачивать.
И может можно как-то поумнее его записать
Код:
SELECT `birthday`
FROM `users` LIMIT 0 , 5
остальное обработать на php
 

frenzy

Новичок
Т.е. дважы сканироваться колонка с `birthday` точно не будет?
В данном случае нужен именно SQL запрос без PHP.

И еще можно ли изменить последовательностьв выода колонок.
Т.е. идет
SELECT
DATE_FORMAT(`birthday`, '%d') as `day_of_birth`,
DATE_FORMAT(`birthday`, '%m') as `month_of_birth`,

Можно поменять их в итоге местами, чтоб сначала `month_of_birth`?
 
Последнее редактирование:

Kotofey

FloodMaster.
Т.е. дважы сканироваться колонка с `birthday` точно не будет?
В данном случае нужен именно SQL запрос без PHP.

И еще можно ли изменить последовательностьв выода колонок.
Т.е. идет
SELECT
DATE_FORMAT(`birthday`, '%d') as `day_of_birth`,
DATE_FORMAT(`birthday`, '%m') as `month_of_birth`,

Можно поменять их в итоге местами, чтоб сначала `month_of_birth`?
поменяй их местами в запросе :)
 

depp

Новичок
автор, если в системе нужен такой функционал, который требует от тебя описанного запроса, то создай отдельно два поля
`day_of_birth`
`month_of_birth`
и триггер на инсерт/апдейд, который будет вставлять в эти поля нужные данные. в итоге при выборке запрос будет обрабатываться моментом.
 

Kotofey

FloodMaster.
автор, если в системе нужен такой функционал, который требует от тебя описанного запроса, то создай отдельно два поля
`day_of_birth`
`month_of_birth`
и триггер на инсерт/апдейд, который будет вставлять в эти поля нужные данные. в итоге при выборке запрос будет обрабатываться моментом.
А если ему позже понадобится и `year_of_birth` , тоже поле создать чтоли и тригер поправить на него? проще всё же наверное получать birthday и на php обрабатывать и получать нужные данные, может в другой ситуации было бы правильный и ваш вариант, но не для получения даты рождения же.
 

depp

Новичок
А если ему позже понадобится и `year_of_birth` , тоже поле создать чтоли и тригер поправить на него? проще всё же наверное получать birthday и на php обрабатывать и получать нужные данные, может в другой ситуации было бы правильный и ваш вариант, но не для получения даты рождения же.
зависит от задачи и нагрузки на проект. можно вообще все в одном поле хранить в serialize объекте. и обрабатывать потом полученные данные на php. только вот скорость работы такого сайта будет крайне низкой. а под нагрузкой он вообще ляжет.
 

Kotofey

FloodMaster.
зависит от задачи и нагрузки на проект. можно вообще все в одном поле хранить в serialize объекте. и обрабатывать потом полученные данные на php. только вот скорость работы такого сайта будет крайне низкой. а под нагрузкой он вообще ляжет.
я же сказал
может в другой ситуации было бы правильный и ваш вариант, но не для получения даты рождения же.
 

Hello

Новичок
frenzy, оптимизировать надо работу с диском\сетью. Твой пример ничего из этого не оптимизирует.
 

frenzy

Новичок
поменяй их местами в запросе :)
Ну спасибо, кэп! В реальном запросе всё немного сложней и там идет поле в котором идет ряд проверок и присваиваются нужные значения переменным, которые используются в последующих полях. И переделывать запрос так, чтобы проверки были на полях, которые идут после - это тот еще гемор будет.

автор, если в системе нужен такой функционал, который требует от тебя описанного запроса, то создай отдельно два поля
`day_of_birth`
`month_of_birth`
и триггер на инсерт/апдейд, который будет вставлять в эти поля нужные данные. в итоге при выборке запрос будет обрабатываться моментом.
Где вообще логика, если я могу получить эти данные из одного поля? Сомневаюсь, что +2 лишних столба в базу дадут большее ускорение, нежели пару операций деления с остатком.

frenzy, оптимизировать надо работу с диском\сетью. Твой пример ничего из этого не оптимизирует.
Ну так я и спрашиваю, что если дважды вызывается `birthday`, то это будет 2, или 1 запрос к базе(диску)? Из ответа я так понимаю один. Хотя вопрос даже в том, попадает текущая строка в память и обращнение к её полям идут оттуда, или каждый раз с диска. Может есть хорошая статья по теме когда поля подгружатся из памяти, а когда с диска и лучше пользовать переменные?
 

artoodetoo

великий и ужасный
Тут нечего оптимизировать. Даже если вы выбираете из таблицы в стопицот миллионов записей, ваш DATE_FORMAT() будет вызван не более чем указанное в LIMIT количество раз.
Вот если бы это было частью условия WHERE, тогда оно влияло бы на план запроса и тогда стоило бы подумать о новых полях.

Смотрите EXPLAIN.
 
Сверху