Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: индексы
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » индексы

Страниц (1): [1]
 

1. Fobius - 16 Ноября, 2009 - 02:52:23 - перейти к сообщению
Я только недавно начал работать над сайтами и приходится вот самому разбиться. Вот сделал одну роботу, только один нюанс мне по ночам уже снится.

В таблице списков магазинов индексирую по id, вот только когда делается удаление, то получатся такой себе пропуск. Искал варианты устранения, нашёл такую штуку как REINDEX, якобы она заново отстраивает по порядку все индексы без пропусков.

Но нигде немогу найти, как ею пользоваться. Подскажите пожалуйста общюю форму использования, а то мне этот порядок индексов с пропусками после удалений не дает покоя.

Слышал, что РЕИНДЕКС когда действует, зависает сервер (не могу себе даже придумать как такое возможно). Есть ли побочьные эффекты и стоит ли ним вообще пользоваться, ведь информации мало будет поступать и врятли индекс вырастит до угрожающих размеров...

Вообщем напишите, кто что знает о реиндексе, а то в инете нету описаний.

заранее спасибо.
2. Viper - 16 Ноября, 2009 - 07:43:57 - перейти к сообщению
для id задайте int(11) NOT NULL AUTO_INCREMENT
primary key(`id`)

и вам не нужно будет заботится о индексах. тем более что такие высоконагруженные операции не стоит делать на продакшенах.

если же варианта нет то drop index, а затем add index
также если база большая или будет большой то используйте в конфиге mysql задать
delay_key_write=ALL
key_buffer_size=1000M
read_buffer_size=512M
record_buffer=512M

PS! Насколько я знаю REINDEX'а в MYSQL нет.
3. valenok - 16 Ноября, 2009 - 08:24:21 - перейти к сообщению
А зачем тебе понадобилось устранять эти пробелы ?
4. EuGen - 16 Ноября, 2009 - 10:56:19 - перейти к сообщению
На практике существует проблемы с индексами и удалениями в storege-engine = InnoDB.
Связано это с тем, что при постоянных удалениях из проиндексированной таблицы появляются "дырки" - очень похоже на фрагментированность жесткого диска. И работа таблицы может существенно замедлиться.
Правда, оговорюсь, я наблюдал это на таблицах размера более 10 млн строк и то когда по ним вместе с удалениями выполнялись частые выборки (высоконагруженная система).
При этом помогает специальная команда OPTIMIZE. Она работает опять-таки только для InnoDB.
Так же примерно раз в два-три месяца выполнялся DROP/CREATE на эту таблицу и все её подобные (то есть, индексы пересоздавались заново вместе с пространством данных)
5. Fobius - 16 Ноября, 2009 - 14:53:54 - перейти к сообщению
Viper пишет:
для id задайте int(11) NOT NULL AUTO_INCREMENT
primary key(`id`)

да впринципи я так и делал. работает все нормально.
Это сайт сумочек и надо в базе только записать магазины в каких они продаются, тоесть записей будет относительно самое минимальное количество, потому думаю что проблем с торможением не будет.
Просто делать мне это все очень нравится, хотелось бы достичь профессионализма, потому хотелось бы даже незначительно, но сберечь скорость обработки, както мне кажется это скорее корректно, чем эфективно.
Работаю с MySQL, потомучто на хосте цПанель установлена.

Короче как я понял, лучше в мелких таблицах не рассматривать такой вопрос, как реиндекс.
Спасибо.

Еще может подскажете, как выводить данные по 3 штуки на каждой странице (пользуясь next, prev), заранее не зная количества всех элементов в таблице. LIMIT не работает с переменными и меня этот вопрос беспокоит. Или просто сделать цыкл где добавлять до индекса тройку на каждой странице? Но тогда будуть мешать те самые "дыры" в индексах при удалении элементов.
Что-то я думаю решение простое, но пока в размышлениях, не могу придумать....
6. Viper - 18 Ноября, 2009 - 08:34:10 - перейти к сообщению
Fobius пишет:
LIMIT не работает с переменными и меня этот вопрос беспокоит.


в смысле не работает ?
CODE (text):
скопировать код в буфер обмена
  1. $limit = $_REQUEST['limit'];
  2. $limitstart = $_REQUEST['limitstart'];
  3. SELECT * FROM db WHERE blabla = '$bla1' LIMIT $limit, $limitstart


для LIMIT в запросе переменные не нужно брать в кавычки иначе не будет работать.

 

Powered by ExBB FM 1.0 RC1