Перейти к контенту
  • 0

Оптимизация 2.0


Balancer

Вопрос

Всем, у кого загруженная система, рекомендую найти по тексту все запросы (обычно с queue) с "<> 1" и заменить их на "= 0". Особенно это важно для topics.php

 

Это позволит MySQL активнее и экономнее пользоваться индексами и внесёт заметноую разгрузку в работу, особенно на больших топиках (от 500 постов и более, скажем, в моём случае).

Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0

Balancer

А тебе не кажется, что в некоторых местах может быть именно не 1 :D. А как насчет NULLов? Так что исправлять по всему коду это громко сказано ;).

Ссылка на комментарий
Поделиться на других сайтах

  • 0

NULL, отличный от 0 навскидку, я не помню, чтобы где-то использовался. Найди такой пример - признаю свою ошибку :D

 

Кроме того, я же написал - "особенно с queue". У тебя есть другие мнения на счёт этого флага? ;)

А, вообще, по хорошему там вообще не INT, а enum(0,1) нужен

Добавлено в [mergetime]1091623688[/mergetime]

>А почему это не сделано по дефолту?

 

Потому же, по чему в iBF не сделано по дефолту ещё море полезных вещей.

Мэтт - продуктивный программер, но пишет далеко не лучший и не безошибочный код. Обсуждалось это уже много раз.

 

>И что именно это меняет? Объясни пожалуйста поподробнее.

 

Ок. Если мы пишем =1, то MySQL проводит соответствующую оптимизацию и может лучше использовать индексы с участием сравниваемого параметра, чем когда пишем <> 0 - это для него уже не однозначное условие, сравниваемых значений может быть много, и запрос уже будет не столь эффективен. Он же не знает заранее, что в таблице этого типа бывают только 0 и 1.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Balancer

То есть в некоторых случаях это может быть хорошо, а в некоторых и плохо? Я правильно понял? Тогда при каких условиях что ставить? Только объясняй пожалуйста немного попроще, а то я в базах вообще никак.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

s0nik

Я немного понял мыслю Balancer`а... :D В Паскале типа если ставить <> 0, т.е. больше-меньше, то типа этому условию будет соответствовать промежуток от (-∞;0)U(0;+∞), а если =1, то только 1 или все остальное... Типа кто изучал Паскаль, тот поймет ;)

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Balancer

Я имею ввиду, что это может быть целесообразно только если поле типа smallint (1), и тут правда сомнительно... А насчет остальных - может подразумевается не обязательно 0. Насчет queue не очень понял...

Ссылка на комментарий
Поделиться на других сайтах

  • 0
NULL, отличный от 0 навскидку, я не помню, чтобы где-то использовался ..

 

Например в mysql :D

 

CREATE TABLE `nulltest` (
            `id` int(10) unsigned NOT NULL auto_increment,
            `foo1` int(11) NOT NULL default '0',
            `foo2` int(11) default NULL,
            PRIMARY KEY  (`id`)
          ) TYPE=MyISAM;
INSERT INTO nulltest (foo1,foo2) VALUES (1,1), (0,0), (0,NULL); 

mysql> select * from nulltest;
+----+------+------+
| id | foo1 | foo2 |
+----+------+------+
|  1 |    1 |    1 |
|  2 |    0 |    0 |
|  3 |    0 | NULL |
+----+------+------+
3 rows in set (0.00 sec)

 

mysql> select * from nulltest where foo2<>1;
+----+------+------+
| id | foo1 | foo2 |
+----+------+------+
|  2 |    0 |    0 |
+----+------+------+
1 row in set (0.00 sec)

mysql> select * from nulltest where foo1<>1;
+----+------+------+
| id | foo1 | foo2 |
+----+------+------+
|  2 |    0 |    0 |
|  3 |    0 | NULL |
+----+------+------+
2 rows in set (0.00 sec)

 

mysql> select * from nulltest where foo2=0;
+----+------+------+
| id | foo1 | foo2 |
+----+------+------+
|  2 |    0 |    0 |
+----+------+------+
1 row in set (0.00 sec)

mysql> select * from nulltest where foo2 is null;
+----+------+------+
| id | foo1 | foo2 |
+----+------+------+
|  3 |    0 | NULL |
+----+------+------+
1 row in set (0.00 sec)

 

Т.е. я написал про =0 только видя таблицу с `queued` tinyint(1) NOT NULL default '0' и только для того чтобы проверили на себе — действительно будет ли от этого быстрее выборка? У меня-то разницы НЕ наблюдалось ;)

Ссылка на комментарий
Поделиться на других сайтах

  • 0

>>NULL, отличный от 0 навскидку, я не помню, чтобы где-то использовался ..

>Например в mysql

 

Естественно, я про iBF говорю! :D

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.