Задать вопрос
@moved_on

Как эффективнее сравнить несколько полей таблицы MySql с одним значением?

Денормализация...))

Есть 3 поля - целочисленные.

Во время выборки каждое из них требуется сравнить с целым числом, соответственно.

В дальнейшем возможен вариант сравнения каждого из полей с массивов целых, размер которого максимально три.

Как сделать выборку "эффективной" для каждого из двух случаев?

Спасибо за уделенное внимание.
  • Вопрос задан
  • 3409 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
eucalipt
@eucalipt
Самоделкин.
Какой бы ты способ не выбрал, ты на этом особо много не потеряешь. Речь идет о паре микро(!)секунд, если они способны сделать погоду твоему проекту, то у меня для тебя плохие новости.

Куда больше времени займет вытаскивание данных из БД. Вообще, с БД нужно по стараться по возможности соединяться как можно реже.

А что касается способа проверки конкретно, то тут всего несколько вариантов.

Смотри.
if () {

} else if () {

} else {

}


Ну тут все понятно, не буду останавливаться.

$yourVar == 1 ? // do in for me if true : // do it for me in case of lie;


В этом способе сначала идет условие проверки, после идет знак вопроса. Проще говоря, мы как бы спрашиваем у интерпретатора, задаем вопрос ему. А потом он просто выбирает, что делать. Если условие дало true, то выполнится часть до двоеточия, а если false, то после двоеточия.
Минусы по сравнению с if - плохая читабельность, также немногоусловность, то бишь на проверку можно отправить только одно условие (отличие - if else) а также то, что выполнять можно только относительно небольшой участок кода.

switch $yourVar;
  case 1:
    // your code
    break;
  case "two":
    // your code
    break
  default:
    // your code


Конструкция switch быстро сравнивает данную переменную (результат выполнения функции, что угодно, проще говоря) с заданными значениями. Значений можно иметь сколько угодно, только это не могут быть математ. выражения и прочая подобная фигня (поправьте, если я не прав). Это должны быть уже просто заранее известные значения.
default здесь определяет, что будет происходить при обнаружении неправильного условия. Точнее, если ни один из предложенных вариантов не подошел. Казалось бы, зачем такое надо, если мы используем только то, что нам точно известно, но, согласитесь, лучше всегда перестраховаться. В конце концов просто выбить в default'е
exit("Unexpected error");

Знаешь, честно скажу, что я не измерял микросекунды различий между этими функциями. Каждая из них хороша по-своему. if лучше читается и понимается в чужом коде (да и в своем, написанном ночью :D), ? : быстрее пишется, switch позволяет быстро пробежаться по заданным значениям. Выбирай сам, а пара микросекунд разницы тебе погоды не должны сделать, поверь.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
Т.е.
where field1 = :const or field2 = :const or field3 = :const

и то же самое, но с in (константные значения)?

Сделайте по отдельному индексу на каждое поле, такой запрос должен будет использовать Index Merge Optimization.
Ответ написан
@likeapimp
web dev, web design
Можно по очереди каждое значение сравнить, можно создать массив из этих значений и каждое значение сравнить с числом в цикле.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы