С нами с 25.08.05
Сообщения: 313
Рейтинг: 231
|
Добавлено: 12/09/06 в 14:51 |
привет
есть проблема...
PHP скрипт: 1 коннект и 5 запросов к MySQL 4.1.21 базе (2 Select и 3 Insert);
примерно 10к запросов в час на этот скрипт;
как результат 100% загрузка проца и разростание свопа до безобразия, иногда падение базы;
сервер P4 3.0, 1Gb, SCSI
с базой соединяюсь через mysql_connect
вот скажите, в чем глюк?
что нужно оптимизировать?
|
|
|
|
Гражданин планеты Земля
С нами с 30.03.03
Сообщения: 7217
Рейтинг: 2185
|
Добавлено: 12/09/06 в 14:57 |
Ну имхо без структуры таблиц, кол-ва записей и алгоритмов запросов. Наверно мало что можно сказать.
|
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 12/09/06 в 18:02 |
Структуру базы , запросы в студию ,конфиг мускуля, ясновидящие все в отпуске....
|
|
|
|
С нами с 25.08.05
Сообщения: 313
Рейтинг: 231
|
Добавлено: 12/09/06 в 18:06 |
переписал скрипт... сча тестирую...
если опять такая ерунда... тогда выложу все в студию...
Оффтопик: мама, чому я не программер
|
|
|
|
БешаныйСуслег
С нами с 16.06.04
Сообщения: 1322
Рейтинг: 1338
|
Добавлено: 12/09/06 в 19:12 |
Специально посмотрел -- 88.62 запросов в секунду на одном из моих серверов. Так что что-то у тебя с запросами... Сколько записей в таблице?
|
|
|
|
С нами с 25.08.05
Сообщения: 313
Рейтинг: 231
|
Добавлено: 12/09/06 в 21:15 |
несколько сотен тыс в сутки добавляется
Select по 2м полям VARCHAR(255)
походу именно этот элемент грузил сильно...
отключил временно > нагрузка ноль )
индекс по ним Fulltext ставить? или как? если нужно полно совпадание фразы...
Insert Не надо ведь никак оптимизировать? или я не прав?
|
|
|
|
С нами с 16.06.03
Сообщения: 192
Рейтинг: 126
|
Добавлено: 12/09/06 в 21:30 |
keenza писал: | несколько сотен тыс в сутки добавляется |
програмера решению которого в базу добавляется сотни тысяч записей в сутки - можно смело расстреливать.
keenza писал: |
Select по 2м полям VARCHAR(255)
|
Селект по стрингам самый сложный для мускула.
1. сделай analize он тебе посоветует в соотвествии с данными - какой тип поля поставить.
2. индекс по ним Fulltext ставить - лично я не советую. Хотя это поможет. Лучше переделать структуру при которой у тебя есть необходимость делать такой запрос.
keenza писал: |
Insert Не надо ведь никак оптимизировать? или я не прав?
|
Всегда есть, что оптимизировать. Например если инсерт не критичен можно рассмотреть Delayed Insert
keenza писал: |
или как? если нужно полно совпадание фразы...
|
Надеюсь ты не делаешь: SELECT FROM table WHERE field LIKE '%myquery%' ???
|
|
|
|
С нами с 25.08.05
Сообщения: 313
Рейтинг: 231
|
Добавлено: 12/09/06 в 22:00 |
Crusader писал: | програмера решению которого в базу добавляется сотни тысяч записей в сутки - можно смело расстреливать.
|
сколько трафа столько и записей, не больше не меньше..
да и не программер я ), а отдать такой скрипт в руки программера мне не хочется , да и цену за него мне заломили больше 5к
Crusader писал: | Селект по стрингам самый сложный для мускула.
1. сделай analize он тебе посоветует в соотвествии с данными - какой тип поля поставить.
2. индекс по ним Fulltext ставить - лично я не советую. Хотя это поможет. Лучше переделать структуру при которой у тебя есть необходимость делать такой запрос.
|
без селекта по стринговым полям никак, вот и мучаюсь
Crusader писал: |
Всегда есть, что оптимизировать. Например если инсерт не критичен можно рассмотреть Delayed Insert
|
ок, попробуем
Crusader писал: |
Надеюсь ты не делаешь: SELECT FROM table WHERE field LIKE '%myquery%' ???
|
нет, делаю через =
Вопрос
в одно поле записыватеся IP, тип данных: varchar(15) индекс FULLTEXT
есть смысл менять на какой другой тип?
спасибо, за советы! жду еще
|
|
|
|
С нами с 18.01.06
Сообщения: 322
Рейтинг: 487
|
Добавлено: 13/09/06 в 00:19 |
keenza писал: |
Вопрос
в одно поле записыватеся IP, тип данных: varchar(15) индекс FULLTEXT
есть смысл менять на какой другой тип?
спасибо, за советы! жду еще |
Блина нафига varchar!!!
Быстро избавляйся, юзай тип double, а IP в скрипте переводи функцией ip2long , обратное преобразование с помощью функции long2ip
Varchar это всегда ЗЛО!
|
|
|
|
С нами с 16.06.03
Сообщения: 192
Рейтинг: 126
|
Добавлено: 13/09/06 в 00:41 |
да, ip хранить в варчар низя.
keenza писал: | сколько трафа столько и записей, не больше не меньше..
|
это неправильно. скажем так: сколько индексов (данных которые можно свести к савокупности) - столько и записей.
Например: если ты делаешь репорт, сколько зашло по рефу уников, по уникальному рефу, то за целый день это будет всего одна запись. ХХХ людей, в ХХХ день, по ХХХ рефу.
попробуй темповые таблы поюзать, которые разгребаются раз в час в индексы ( в минимально возможные для тебя савокупности)
|
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 13/09/06 в 10:58 |
Crusader писал: | програмера решению которого в базу добавляется сотни тысяч записей в сутки - можно смело расстреливать.
|
+1
1)varchar в топку.
2)insert батчем через FILE.
3)Афтор, ты по-русски понимать? Без структуры базы и запросов тебе нечем не помогут коих ты досих пор не продемонстрировал.
4)Скрипт который добавляет несколько сотен тысяч записей в базу в сутки можешь смело удалять !
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 13/09/06 в 12:17 |
Цитата: | сколько трафа столько и записей, не больше не меньше.. |
почему бы не обрабатывать логи апача?
|
|
|
|
С нами с 25.08.05
Сообщения: 313
Рейтинг: 231
|
Добавлено: 13/09/06 в 14:34 |
спасибо за дельные советы!!
реально некоторые помогли
к сожалению не самих скриптов не структуры базы выложить не могу...
используются идеи, которые не подлежат огласке, основанные на долгом собственно и чужом опыте...
но все равно спасибо ребята
хоть не на 100%, но кнопка заработала
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 13/09/06 в 15:19 |
Full text, если я не ошибаюсь, юзается только при full text search, а тебе до него далеко. Создай обычный двойной индекс по этим полям.
|
|
|
|
С нами с 25.08.05
Сообщения: 313
Рейтинг: 231
|
Добавлено: 13/09/06 в 16:15 |
proc3nt писал: | Блина нафига varchar!!!
Быстро избавляйся, юзай тип double, а IP в скрипте переводи функцией ip2long , обратное преобразование с помощью функции long2ip
Varchar это всегда ЗЛО! |
Код: |
string long2ip ( int proper_address )
int ip2long ( string ip_address ) |
Вопрос:
я не понял зачем double? ip2long Integer возвращает
Цитата: |
Full text, если я не ошибаюсь, юзается только при full text search, а тебе до него далеко. Создай обычный двойной индекс по этим полям.
|
у меня запрос:
Код: |
// string1 VARCHAR(255)
// string2 VARCHAR(255)
SELECT string1, string2 FROM table WHERE string1 = 'bla-bla-bla' and string2 = 'bla2-bla2-bla2';
|
нужно именно полное совпадение строк...
Вопрос-2:
какой все таки индекс использовать?
этот селект грузит сервак больше всего...
на инсертах нагрузки нет
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 13/09/06 в 16:32 |
Full text тут вообще не при чем в таком запросе. Делай двойной индекс, говорю:
ALTER TABLE table ADD INDEX idx1 (string1,string2)
и дропни свой фул текстю он без надобности, а сервак грузит на инсертах и апдейтах.
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 13/09/06 в 16:37 |
И вот еще что. Если ты айпи всетаки решил в варчар хранить (извращенец ) то нах тебе 255 длина? У айпи макс длинна: "ххх.ххх.ххх.ххх" = 15 символов. Делай varchar(15)
|
|
|
|
С нами с 13.08.03
Сообщения: 533
Рейтинг: 481
|
Добавлено: 13/09/06 в 17:44 |
для VARCHAR(), если оно не BINARY - это абсолютно по барабану
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 13/09/06 в 17:51 |
dm писал: | для VARCHAR(), если оно не BINARY - это абсолютно по барабану |
Для варчар может и да. А вот для размера и производительности таблицы и индекса - не совсем.
|
|
|
|
С нами с 13.08.03
Сообщения: 533
Рейтинг: 481
|
Добавлено: 13/09/06 в 18:00 |
Pentarh писал: | Для варчар может и да. А вот для размера и производительности таблицы и индекса - не совсем. |
не, я именно размер и имел ввиду
чтобы не спорить - нашел :
11.4.1 The `CHAR' and `VARCHAR' Types
-------------------------------------
...`VARCHAR' values are stored using only as many
characters as are needed, plus one byte to record the length (two bytes
for columns that are declared with a length longer than 255).
больше 16 байтов не займет, индексы отсюда же пляшут
просто максимальный размер, после которого режется - 15 или 255 без разницы
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 13/09/06 в 18:16 |
Ну хорошо. Зри в корень. Есть у тебя строка с полем варчар 255. Туда ты записал 15 символов. Теперь ты делаешь апдейт и записываешь туда 200 символов.
Вот подумай, сама эта операция как будет выглядеть физически? Если идти по твоему варианту, то мускуль должен вырезать эту строку из файла и вставить новую строку в конец, т.к. новый размер больше старого.
На самом деле, мускуль резервирует для этого поля в файле 255 байт в любом случае. И при апдейте ничего не вырезает.
Получается, если реальная длина не превышает 15 байт, то имеем нехуевый overhead, учитывая что туда пишутся сотни тысяч записей в сутки.
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 13/09/06 в 18:26 |
Цитата: | На самом деле, мускуль резервирует для этого поля в файле 255 байт в любом случае. |
С чего ты взял ? Резервирует вроде 2 (или 4) байта, а там сколько ты будешь использовать уже. Это char() резервирует сразу заявленное число. Иначе смысла от варчара нет.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
1
|
|
|
С нами с 13.08.03
Сообщения: 533
Рейтинг: 481
|
Добавлено: 13/09/06 в 18:29 |
да не надо по "моему варианту" идти, там от меня ничего не зависит
надо доки к мускулю читать просто-напросто..
ну стыдно программеру такое не знать
`VARCHAR' and the `BLOB' and `TEXT' types are variable-length types.
For each, the storage requirements depend on the actual length of column
values (represented by L in the preceding table), rather than on the
type's maximum possible size. For example, a `VARCHAR(10)' column can
hold a string with a maximum length of 10. The actual storage required
is the length of the string (L), plus one byte to record the length of
the string. For the string `'abcd'', L is 4 and the storage requirement
is five bytes.
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 13/09/06 в 18:32 |
погоди, может я просто тебя неправильно понял. Ты хочешь сказать что вот эта вот цифра 255 в определении поля varchar вообще ничего не значит?
Конкретнее вопрос. По твоему, не имеет значения, хранить ли айпи в varchar255 или varchar15?
|
|
|
|
С нами с 13.08.03
Сообщения: 533
Рейтинг: 481
|
Добавлено: 13/09/06 в 18:49 |
Pentarh писал: | погоди, может я просто тебя неправильно понял. Ты хочешь сказать что вот эта вот цифра 255 в определении поля varchar вообще ничего не значит? |
значит
максимальную длину строки, которую можно в этом поле сохранить и ничего более
Pentarh писал: |
Конкретнее вопрос. По твоему, не имеет значения, хранить ли айпи в varchar255 или varchar15? |
совершенно верно, никакой разницы
ни для размера базы, ни для индексов - в любом случае 16 байт максимум
каюсь, сам я делаю BINARY VARCHAR(15) для IP
15 - чисто психологически
VARCHAR - потому что именно текстовый поиск нужен почти всегда
BINARY - без case conversion и без учета кодировок, ни к чему тут
|
|
|
|