Перейти к контенту
  • 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

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

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

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

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

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

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

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

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

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