Задавайте вопросы, мы ответим
Вы не зашли.
Пишу скрипт на php 5. Использую mysql.
Собственно в БД таблица 100 мегабайт, 1 милион записей.
столбик ник является индексом.
Дальше то в чём возникают сложности. Это то что в минуту нужно добавлять 1000записей, по схеме вначале поиск, потом если поиск отрицательный то вставляем запись.
вот эти два запроса
поиск -$query="SELECT count(*) FROM ".$bdname." WHERE word='$word'";
запись-$query = "INSERT INTO ".$bdname." (id,word,prosmotrov,date) VALUES ('','$word','$prosmotrov',NOW())";
Информация о сервере
CPU : 1000MHz
RAM : 256Mb
ОС : Fedora Core 5
MySQL : 4.1.21
В общем сервак жутко тормозит... как оптимизировать БД? тока апгрейтом сервера?(переезда на более крутой)
Я новичок в БД так что извеняюсь, если где ступил...
Неактивен
Во-первых, можете попробовать повыбирать тип таблицы. На большом количестве
изменений будет показывать хорошую производительность InnoDB.
Во-вторых, если Вам нужно всего лишь вставить данные (т.е. результат count(*) Вас
не интересует), то можно просто вставлять данные и обрабатывать сообщение об
ошибке. Разумеется, при этом нужно, чтобы у Вас был уникальный ключ на поле word.
В третьих, я не понял, при чем тут поле nick, оно нигде не используется. Если в Вашей
текущей конфигурации нет индекса по полю word, то добавление его решит большинство
Ваших проблем
Неактивен
paulus cпасибо за быстрый ответ!
nick-ну поле называется text просто оно с никами) опечатался... индекс по полю word есть.
как я понял есть два способа оптимизации:
1)уникальным ключём сделать поле ворд
2)использовать InnoDB
второе я не уверен что смогу поставить InnoDB
а первое не могу понять почему даст прирост производительности? ведь всё равно mysql ищет употреблялось ли это значение?
Неактивен
Критично не столько добавление уникальности к ключу (хотя, оно тоже будет давать
немного более быстрые результаты), сколько комбинация с одной операцией вставки.
В случае двух операций, сервер ищет нужную запись два раза. В случае одной - только
один раз.
Если Вы вынуждены работать с MyISAM, попробуйте, например, установить значение
системной переменной concurrent_insert в 2 - тогда SELECTы не будут блокировать Ваши
INSERTы. Не ждите, однако, от этого огромного повышения производительности: при
таком количестве вставок конфликтовать будут уже сами вставки в таблицу.
Возможно, имеет смысл аггрегировать часть INSERTов во временном хранилище, а потом
вставлять в базу большим куском - это немного уменьшит блокировки таблицы.
Неактивен
paulus большое спасибо! первое решенгие самое оно. По поводу MyISAM не подходит ибо задача чтоб скрипт легко перенасился...
Ну надеюсь оптимизации в виде одной операции хватит нет то уже придётся решать проблемы в виде апгрейта оборудования.
Неактивен