Оптимизация под большие нагрузки

Статус
В этой теме нельзя размещать новые ответы.
Получил интересные данные! :ay:
Изначально тестовый вариант был таков как я писал ранее:
PHP:
for ($x=0; $x<100; $x++) {
    $name=mt_rand(0,12312331213);
    $nami=mt_rand(5,7);
    $link = Connect2DB();
    $query = "INSERT INTO `test` VALUES('0','".$name."','".$namei."','N');";
    mysql_query($query,$link) or die(mysql_error()."<br />\n".$query);
    @mysql_close($link);
}
Итог:
Скрипт выполнен за 1.055 сек.
Скрипт выполнен за 1.008 сек.
Скрипт выполнен за 0.9279 сек.
Скрипт выполнен за 1.0018 сек.

затем я вынес подключение и разъединение с бд из цикла вовне, и получилось вот что
PHP:
$link = Connect2DB();
for ($x=0; $x<100; $x++) {
    $name=mt_rand(0,12312331213);
    $nami=mt_rand(5,7);
    $query = "INSERT INTO `test` VALUES('0','".$name."','".$namei."','N');";
    mysql_query($query,$link) or die(mysql_error()."<br />\n".$query);
} 
@mysql_close($link);
Итог:
Скрипт выполнен за 0.022 сек.
Скрипт выполнен за 0.0435 сек.
Скрипт выполнен за 0.0224 сек.
Скрипт выполнен за 0.0417 сек.

Разница в 20 раз! :ay: нрааица

p.s. при нынешнем раскладе зависло не на 38 раз, а на 933ий. горааааздо лучше, но все равно далеко не идеал. А какая обратная сторона у палки "выключим постоянное соденение пхп и мускуля"?
 
с бд соединяться на каждой итерации цикла - сильно ...

могу предположить что у вас myisam таблица, поэтому и медленно вставка происходит. попробуйте сделать innodb хранилище и отключить "mysql autocommit" (это погуглить)
 
а мне не надо чтобы вставка была быстро. мне надо наоборот, чтобы потом извлечение было как можно быстрее. а вставку можно перетерпеть
 
Слветую скрипт кстати, из командной строки запускать:
Код:
Z:\usr\bin\php5 -f X:\путь_к_файлу.php
(это на тот случай если ты его из под браузера запускаешь)

А еще можеш типа такой штуки сделать:
PHP:
$link = Connect2DB();
for($j=0;$j<10;$j++){
    $query = '';
    for($x=0; $x<10; $x++) {
        $query .= "INSERT INTO table VALUES('','');";
    }
    mysql_query($query,$link);
}
@mysql_close($link);
Тоесть большие однотипные запросы формировать.

чтобы потом извлечение было как можно быстрее
При той таблице что ты указал ранее выборка по id будет очень быстро происходить. если по нескольким полям будеш производить выборку, то просто сложный индекс добавь:
 
чтож... часть темы потерлась :confused: счас у меня такой вопрос- а чем можно заменить ORDER BY RAND() ? как тогда дергать из бд случайные значения?? А то ORDER BY RAND() замедляет очень сильно, но мне все-таки надо достать случайные значения
 
чтож... часть темы потерлась :confused: счас у меня такой вопрос- а чем можно заменить ORDER BY RAND() ? как тогда дергать из бд случайные значения?? А то ORDER BY RAND() замедляет очень сильно, но мне все-таки надо достать случайные значения
Ничем...Надо переложить RAND на PHP ,а уже конкретно выбирать запись с таблицы (по id --оно должно быть автоинкрементное.)
 
Ничем...Надо переложить RAND на PHP ,а уже конкретно выбирать запись с таблицы (по id --оно должно быть автоинкрементное.)

Это если не удаляются строки.

А по теме - почитайте про грамотную настройку mysql и под большие объёмы информации юзайте INNODB, она реально менее падучая.
 
Это если не удаляются строки.
Да только в этом случае,чтобы не было дырок в автоинкрементном поле.
Но можно выбрать все id загнать их в массив ,применить array_rand() и выбрать конкретное поле(поля)из таблицы.
 
APC позволяет ускорить исполнение скриптов за счет того что не надо каждый раз парсить php и выпонлять его. Для просмотра ссылки Войди или Зарегистрируйся

Memcached используется для кэширования данных полученных из БД в памяти. Дернули из базы запись, сохранили ее в кэше, следующий раз тянем из кэша а не из базы
Не только из БД можно любые данные. Это удобно в ряде случаев, например, дерево меню или комментов в форуме можно сохранять не только результат запроса, но и результат расстановки ветвей по порядку.

Добавлено через 7 минут
Ничем...Надо переложить RAND на PHP ,а уже конкретно выбирать запись с таблицы (по id --оно должно быть автоинкрементное.)
Добавлю мысль снимающую обязательность непрерывности id материалов:
1. Общее число записей запрос простой.
2. Даже его можно делать изредка, так как вероятность ошибки тем меньше чем статей больше.
3. RAND отказать, переложить на ПХП (т.к. при RAND перебирается вся таблица).
4. Конструкцией типа "SELECT LIMIT/OFFSET" выбираем запись, где ЛИМИТ=1, а ОФФСЕТ=СЛУЧАЙНОЕ ЧИСЛО
 
мммм я вот думаю, может еще более упростить базу. Сделать чтобы таблица создавалась для каждой группы своя, и тогда допустим вместо
PHP:
SELECT * FROM `videos` WHERE `group`='1'
будет
PHP:
SELECT * FROM `videos_gr1`
where вообще убрать то есть. будет быстрее работать? учитывая что тогда кол-во таблиц получается около.... ммм.... от 4 до 100 )) Но кол-во записей на одну таблицу будет не полтора миллиона допустим, а гораздо меньше.

И еще не совсем понял насчет выборки случайного значения. То есть я понял что можно сперва в пхп написать что-нить вроде mt_rand(0,$l) где $l это у нас кол-во записей в таблице. и потом уже делать select where id=$l. Но не понял как учесть тот случай что у нас есть удаленные айдишники.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху