SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.01.2009 15:10:08

EzheG
Участник
Зарегистрирован: 13.01.2009
Сообщений: 20

уменьшить нагрузку на серв

Здравствуйте. Подскажите пожалуйста мне по нескольким воросам.

1. Много читал про постоянные соединения, что они уменьшают нагрузку на сервак и т.п. У меня такая ситуация: чуть более 100 форумов на одной базе (5.0.22, MyISAM) на выделенном сервере. Как то пробовал включить pconnect, получилось что постоянно висело 70+ процессов, но ведь по идее должен быть один? Собственно интересует почему их так много, ведь эти форумы используют одни и теже файлы, один и тотже логин-пасс к БД, только таблицы в БД разделены для каждого форума префиксами.

2. Внешние ключи позволяют связать столбцы разных таблиц. А возможно ли сделать так, чтобы значение одного столбца равнялось сумме 2х других в одной таблице и автоматически изменялось с изменением двух первых?
c1  c2   c3(c1+c2)
-------------
32 5    37
24 22  46
57 3    60

3. Какие ключи помогают сортировкам?

Неактивен

 

#2 13.01.2009 16:08:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: уменьшить нагрузку на серв

1. Одного соединения, конечно, не будет - у Вас же несколько человек _одновременно_ обращаются
к базе => одновременно несколько постоянных соединений открыто. Другое дело, что когда один сценарий
отработал, другие потом могут использовать уже установленное свободное соединение.

2. Это можно сделать с помощью триггеров.

3. Сортировкам помогают правильные ключи smile Все зависит от запроса. Допустим, для запроса
"SELECT ... FROM a WHERE b = 1 ORDER BY c" правильным ключом будет ключ на (b,c).

Неактивен

 

#3 13.01.2009 17:53:21

EzheG
Участник
Зарегистрирован: 13.01.2009
Сообщений: 20

Re: уменьшить нагрузку на серв

1. Интересно smile Но в таком случае наверно лучше увеличить max connections. Если увеличить max connections ничег больше ненужно изменять?

2. Думаю в моём случае так нужно?

CREATE TRIGGER sum AFTER UPDATE ON table
  FOR EACH ROW BEGIN
    UPDATE table SET c3 = c1 + c2 WHERE с1 = NEW.c1 OR с2 = NEW.c2;
  END;

Предчувствую что-то напортачил...

3. Понял...

Неактивен

 

#4 13.01.2009 19:39:47

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: уменьшить нагрузку на серв

Мммм... одно плохо - триггер не может изменять ту же таблицу. Иначе будет рекурсия.
Но в данном случае можно немного схитрить wink


mysql> create table cc (a int, b int, c int);
Query OK, 0 rows affected (0.02 sec)

mysql> create trigger ai_cc before insert on cc for each row set new.c = new.a + new.b;
Query OK, 0 rows affected (0.03 sec)

mysql> insert cc values (1,2,0);
Query OK, 1 row affected (0.04 sec)

mysql> select * from cc;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    2 |    3 |
+------+------+------+
1 row in set (0.00 sec)


--

max_connections вполне достаточно smile можете посмотреть еще в сторону количества открытых
таблиц - может быть, стоит подкрутить его тоже.

Неактивен

 

#5 14.01.2009 10:40:31

EzheG
Участник
Зарегистрирован: 13.01.2009
Сообщений: 20

Re: уменьшить нагрузку на серв

Спасибо большое. Сразу и про кодировку спрошу. В бд стоит латина, как то задумал сделать конвертацию, почитал мануальчики, но не стал этог делать т.к. бд весит около 3 гигов, комп просто не откроет такой большой дамп))) Так вот... я потом задумался, а стоит ли вообще замарачиваться с этой кодировкой? Ведь всё нормльно работает, русский текст выводится, с буквой "ё" вроде проблем не замечал. Конечно не удобно в phpmyadmin как отображается текст, и это пока единственная несущественная проблема для меня. И всё таки как будет лучше, оставить латину или переделать на cp1251 ? Влияет кодировка как то на производительность?

Неактивен

 

#6 14.01.2009 10:56:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: уменьшить нагрузку на серв

"Работает - не трогай" smile

А вообще - если будут какие-то проблемы - то восстанавливать будет куда сложнее. latin1 - семибитная
кодировка. При попытке запихать туда данные из любой другой кодировки - русские буквы не пролезут.
Т.е. если Вы тупо сделаете dump / restore - данные не восстановятся (т.к. дамп в utf8).

Реально Вам нужно менять только метаданные. Насколько я понимаю, у Вас единственная база в этом
экземпляре MySQL, поэтому самое простое - поставить кодировку по-умолчанию cp1251 для сервера
(default-character-set = cp1251) и перезапустить сервер. Тогда таблички от четверки подхватятся сразу
в нужной кодировке. Если таблички уже сконвертированы в формат пятерки - то увы, прийдется преобразовывать
так, как написано в статье.

Неактивен

 

#7 20.01.2009 10:12:32

EzheG
Участник
Зарегистрирован: 13.01.2009
Сообщений: 20

Re: уменьшить нагрузку на серв

В логах выскакивает такая ошибка:

090120 01:10:09 mysqld restarted
... /bin/mysqld: Out of memory (Needed 714548224 bytes)

и строк "Out of memory" несколько подряд.

А иногда бывает такая:

[ERROR] Out of memory... длинющий текст с разъяснениями на английском, затем список переменных key_buffer_size,... и формула результат которой равен 1809630К

Все эти ошибки указывают что у меня завышенные параметры конфига?
Оперативки 2 гига.

Конфиг:
key buffer size 768M
sort buffer size 4M
read buffer size 1M
table cache 1,024

Отредактированно EzheG (20.01.2009 10:13:32)

Неактивен

 

#8 20.01.2009 13:47:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: уменьшить нагрузку на серв

Наверное, еще и 32-битная операционка. На 32-битной платформе процесс не может выделить
более 2 гигабайт ОЗУ, (даже если есть своп в Вашем случае) - прийдется уменьшить параметры.
Ну или обновить ОС smile

Неактивен

 

#9 20.01.2009 15:49:25

EzheG
Участник
Зарегистрирован: 13.01.2009
Сообщений: 20

Re: уменьшить нагрузку на серв

Понятненька...
А вот эти значения что показывают?

Key_buffer_fraction_% 72.31 %
Key_write_ratio_% 67.25 %
Key_read_ratio_% 0.68 %

Как я понимаю table_cache задаёт память для хранения инфы о таблицах... а сколько отводится памяти для одной таблицы? Ну хотя бы примерно smile
А то у меня вот как ))))

Open_tables 1,024
Opened_tables 74 k

Неактивен

 

#10 20.01.2009 16:08:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: уменьшить нагрузку на серв

Эти значения показывают заполненность буффера и соотношение запрос/реальных действий
для записи и чтения ключей. Это написано в мане той утилиты, которую Вы тут не написали wink

Примерно на хранение дескриптора таблицы выделяется 4 байта внутри программы + сколько-то
байт внутри libc... думаю, порядка нескольких десятков.

Неактивен

 

#11 24.01.2009 09:45:08

EzheG
Участник
Зарегистрирован: 13.01.2009
Сообщений: 20

Re: уменьшить нагрузку на серв

paulus, спасибо Вам большое smile

Стал разбираться в одном тормозном запросе

SELECT p.pid, p.author_name, p.post_date, p.forum_id, p.topic_id, p.author_id, p.post, t.title ,f.name
FROM posts p , topics t, forums f
WHERE t.tid=p.topic_id AND t.forum_id=f.id AND p.forum_id NOT IN (3, 27)
ORDER BY pid DESC LIMIT 0,25


Эксплейн вроде не плохой, но запрос выполнятеся 30 секунд при условии что строк в posts около 350т.

id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra 
1 SIMPLE f ALL PRIMARY,id NULL NULL NULL 60 Using temporary; Using filesort
1 SIMPLE t ref PRIMARY,forum_id forum_id 2 f.id 11   
1 SIMPLE p ref topic_id,forum_id topic_id 4 t.tid 280 Using where

И к тому же в таблице forums почему то разрабы сделали двойной ключ на id:

CREATE TABLE `forums` (
  `id` smallint(5) NOT NULL default '0',
  `topics` mediumint(6) default NULL,
  `posts` mediumint(6) default NULL,
  ...
  PRIMARY KEY  (`id`),
  KEY `category` (`category`),
  KEY `id` (`id`)
) ENGINE=MyISAM


Смысл в двойном ключе? Или просто ошибка?
И чтобы такого с первым запросом сделать чтобы быстрее обрабатывался? smile


CREATE TABLE `posts` (
  `pid` int(10) NOT NULL auto_increment,
  `append_edit` tinyint(1) default '0',
  `edit_time` int(10) default NULL,
  ...
  PRIMARY KEY  (`pid`),
  KEY `topic_id` (`topic_id`,`author_id`),
  KEY `forum_id` (`forum_id`,`post_date`),
  KEY `author_id` (`author_id`),
  FULLTEXT KEY `post` (`post`)
) ENGINE=MyISAM

Неактивен

 

#12 25.01.2009 09:27:45

EzheG
Участник
Зарегистрирован: 13.01.2009
Сообщений: 20

Re: уменьшить нагрузку на серв

Самже нашёл ошибку в запросе, нужно вместо "AND p.forum_id NOT IN (3, 27)" сделать "AND f.id NOT IN (3, 27)".
Но двойной ключ всё равно непонятен мне.

Неактивен

 

#13 26.01.2009 14:26:03

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: уменьшить нагрузку на серв

Второй такой же ключ, конечно же, не нужен smile

Неактивен

 

#14 19.04.2009 16:29:54

EzheG
Участник
Зарегистрирован: 13.01.2009
Сообщений: 20

Re: уменьшить нагрузку на серв

Здравствуйте. Читал статейки про внешние ключи и появилось пару вопросов.

В настоящее время в MyISAM работают внешние ключи? А то читал что они работают только в InnoDB только. Ещё где то читал что они могут вроде как работать в MyISAM но при создании таблицы если в коде прописан внешний ключ то он не обрабатывается. Сейчас же поставил внешний ключ на 2 таблицы своей БД и был приятно удивлён что определённые запросы используют его. Поставил второй ключ на другие таблицы - никакого эффекта в explain'е. В phpmyadmin нет вывода внешних ключей. И при создании дампа внешние ключи там не проявляются. Чорт знает что кароче smile Может их и не использовать? )))

Неактивен

 

#15 20.04.2009 00:22:18

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: уменьшить нагрузку на серв

В MyISAM внешние ключи не работают - при создании таблицы вместо них создаются обычные ключи.

Неактивен

 

#16 12.05.2009 14:21:26

EzheG
Участник
Зарегистрирован: 13.01.2009
Сообщений: 20

Re: уменьшить нагрузку на серв

До недавних пор всё работало хорошо, но вдруг посыпались ошибки:
[ERROR] /usr/.../mysqld: Can't find file './dbserv/table_groups.frm' (errno: 23)
[ERROR] Error in accept: Too many open files in system

Проводил проверку и починку таблиц, надеялся что этим решится первая ошибка. Но ничего. Сайт, кстати, несмотря на эту ошибку работает нормально. Но из-за второй бывают частые перебои, при заходе на сайт пишется 403 ошибка О_о
Очень странно. Подскажите как решить проблемы?

Неактивен

 

#17 13.05.2009 17:47:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: уменьшить нагрузку на серв

VDS? Вы упираетесь в количество открытых дескрипторов в системе. Нужно поднять этот параметр.
Если крутить эту ручку не можете, можно попробовать ограничить количество открытых таблиц
(open_tables_limit) и соединений с базой (max_connections). Но это приведет, возможно, к другим
проблемам типа «не хватает соединений»...

Неактивен

 

#18 13.05.2009 22:32:22

EzheG
Участник
Зарегистрирован: 13.01.2009
Сообщений: 20

Re: уменьшить нагрузку на серв

Выделенный серв.
max connections 300 стоит, но в реале не превышает 80.

table cache 5,092
tmp table size 33,554,432
max heap table size 33,554,432
max tmp tables 32
open files limit 11,095

До этого open files limit был ровно в 3 раза больше table cache и всё работало нормально, но вдруг стало тупить. Подскажите, есть ли логика в моих настройках с учётом того в бд тысячи таблиц?

Отредактированно EzheG (13.05.2009 22:33:04)

Неактивен

 

#19 14.05.2009 16:20:43

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: уменьшить нагрузку на серв

Логика open_files_limit = 3*table_cache_size очень даже оправдана
(1 MyISAM табличка = frm + MYD + MYI).

Неактивен

 

#20 17.05.2009 10:01:20

EzheG
Участник
Зарегистрирован: 13.01.2009
Сообщений: 20

Re: уменьшить нагрузку на серв

Спасибо. Попробую уменьшить эти оба параметра.

Подскажите пожалуйста по такому ещё вопросу. Действительно ли советуется использовать NOT NULL везде, где только можно?

Неактивен

 

#21 18.05.2009 11:40:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: уменьшить нагрузку на серв

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

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson