![]() |
select при 100.000 строк в таблице.
Можно каким нибудь хитроумным запросом брать из такой таблицы со скоростью, как при запросе в маленькую таблицу?
|
То есть есть большая таблица, 100.000 строк. Определенные записи запросом:
$q=mysql_fetch_array(mysql_query('SELECT * FROM '.$table.' WHERE user_id='.$g['user_id'].' LIMIT 1')); грузятся очень долго... |
таблица проиндексирована?
|
да!
|
Вопрос - столь ли необходимо читать все 100к записей?
И, эээ, зачем делать 100к запросов, логично что они будут тормозить. PHP код:
|
Так я от туда беру максимум 30 записей... но выводятся они от 5ти секунд, бывает и все 10.
хотелось бы услышать о выборке одной определенной строки.. |
rcc0023 Вы просто пытаетесь нивелировать достоинства мускуля
PHP код:
|
а какие у тебя в этой таблице есть индексы ... может они просто не используются
|
Индексировать нужно те поля, по которым ведется поиск.
зы может это уже не мускул лагает, а сама тачка(мало опёры, слабый проц, параллельно играешь СоD4) |
Индекс первичный... с auto_increment
вы меня запутали.... получается все правильно сделано, только вся проблема в сервере и кол-ве строк? p.s. оперы на 1000мб, на кроне висят скрипты постоянно что то добавляющие в базу.. |
Если эти самые 30 записей получаются таким методом. То проблема не в количестве строк, а в реализации
PHP код:
|
Да.... Спасибо!
|
эм ну скромно добавлю посоветую вернее... почитай внимательно документацию по SQL запросам очень много интересного.
Ваще базы данных эт наука ) со своей теорией (в нете можно многое найти) ну а чисто полезные советы: если ты делаешь SELECT * FROM но используешь тока например поле user_id это очень плохой тон тк базе да и памяти срипта потребуется больше времени на обработку чем если бы ты сделал SELECT user_id FROM очень часто нужно узнать количество полей там или подсчитать ченить начинающие программисты делают так SELECT * FROM и потом смотрят mysql_num_rows или ваще цикл $cnt++ )) в MySQL есть такая интересная штука как count() PHP код:
есть еще интересная функция например max которая выберает максимальный элемент одним запросом... почитай в общем. Ну и не забывай о безопасности всегда значения передаваемые в WHERE пиши в кавычках типа WHERE id='1' это спасет тебя если на серверы включены magic_quotes_gpc типа id=1' OR 1=1/* ВСЕ входящиее переменные особено $_GET нужно проверять и явно указывать их тип (спасет от подстав типа ?page[]=2) например так $id=preg_replace("/\D/","",(int)$_GET['id']); Удаче, товарищь! ) |
Ооо... есть над чем думать.... ! +++++++ =)
Цитата:
|
Лишних кавычек не бывает )))
пример where id=$id / ?id=2-1 / id=2-1 (результ id=1) where id='$id' / ?id=2-1 / id='2-1' (результ ??? а результом будет id=2) PHP код:
даже отсутсвие каких либо выводимых данных признак того что ошибка есть, поэтому нужно обязон делать проверки типа if(mysql_num_rows() > 0) else { $id=1 ; } а лучше ваще перенаправления куданить на главную или к списку там тем незнаю чего ) меня лично это очень добивает потомучто приходится возвращатся на зад и тестить дальше )))) |
Gar|k "Лишних кавычек не бывает )))"
Лишние кавычки конечно же бывают, ибо тогда производится неявное преобразование типов, что на больших объемах данных может дать заметное замедление. Так что необходим смотреть на это дело со стороны безопасности - необходимы ли они в конкретном случае или нет. |
используй индексы! у меня из 200к рандомно 20 рядов берет за 0.02 секунд!
|
А как использовать (организовать, создать) индексы?
|
Ну я понимаю это так
таблица id text id=primary key, auto_increment (писал по памяти) ну и все select text from table where id=5 хотя я могу ошибатся я пока теорию мало изучал может еше чам че замудреное есть ) |
| Время: 22:23 |