Помощник
|
Правильный запрос к большой таблице... |
1nSane
|
Сообщение
#1
|
||
|
|
||
|
|||
alexdrob |
13.3.2011, 3:18;
Ответить: alexdrob
Сообщение
#2
|
|
чем плох вариант ?
[PHP]$count = mysql_result(mysql_query("SELECT count(*) FROM `files` WHERE dead='0'"),0);[/PHP] |
|
|
1nSane
|
Сообщение
#3
|
|
Также вешает систему
Такое ощущение, что индекс не работает, а тупо начинает перелопачивать всю таблицу. Ибо есть поиск, и когда делаешь: [PHP]$query = mysql_query("SELECT id,filename FROM `files` WHERE MATCH (filename) AGAINST('".$string."') LIMIT 100"); $count = mysql_result(mysql_query("SELECT COUNT(*) FROM `files` WHERE MATCH (filename) AGAINST('".$string."')"),0);[/PHP] Тут все моментально, а при замене на mysql_num_rows были тормоза... проверялось на запросе, выдающем 2350 строк... Кстати, нет варианта как-то объединить, оптимизировать эти 2 запроса?... |
|
|
Mulder_hb |
13.3.2011, 19:03;
Ответить: Mulder_hb
Сообщение
#4
|
|
Для таких таблиц mysql_num_rows отметаем сразу. Что делает код:
[PHP]$count = mysql_num_rows(mysql_query("SELECT id FROM `files`"));[/PHP] Сначала будут извлечены все id из таблицы с 15 млн записей. Этот гигантский никому не нужный результат будет помещен во внутреннее представление пхп. А не надорвется ли он? Потом начнется реальный подсчет кол-ва записей в результирующем наборе. Вы еще удивляетесь, почему все тормозит и виснет? Что делает код [PHP]$count = mysql_result(mysql_query("SELECT count(*) FROM `files`"), 0);[/PHP] Никакого реального подсчета не происходит. Мускул просто извлекает заранее сохраненное число из служебной таблицы. Вот поэтому все и летает. Создавать индекс на поле enum с допустимыми данными 0 и 1 вообще бессмысленно. Правило гласит: "Не индексируйте столбцы, которые содержат только несколько отличающихся между собой значений". Если мускул определяет, что одно и тоже значение занимает более 30% индекса, он вообще отказывается использовать этот индекс. У вас идентичность индекса составляет 50%. |
|
|
1nSane
|
Сообщение
#5
|
|
Спасибо за пояснения, тогда индекс снесу... только вот вопрос, как же мне корректно определять количество записей с dead=0? Чтоб не вешать систему... GROUP BY тоже не поможет?
|
|
|
Mulder_hb |
14.3.2011, 10:59;
Ответить: Mulder_hb
Сообщение
#6
|
|
Не знаю, почему у вас все весит. У меня такая же структура таблицы, только весит база 1,5 ГБ. Подобный запрос проходит мгновенно. Попробуйте вместо enum указать тип int(1). Также почитайте доку по enum, как на самом деле нужно к нему обращаться. В вашем случае запрос, скорее всего, будет таким:
[PHP]$count = mysql_result(mysql_query("SELECT COUNT(*) FROM `files` WHERE `dead` = 2"), 0);[/PHP] |
|
|
1nSane
|
Сообщение
#7
|
|
|
В других проектах все ОК с указанием явного значения енума ;) а тормоза тут... все затрудняется тем, что не только поиск мне нужен, но и постоянный UPDATE и INSERT значений, при выборке за 2-5 сек остальное падает в Locked...
с интом попробую... Может дело не в размере записей? а их кол-ве, у меня уже 20 миллионов и число растет, планируется к концу марта 100 млн достигнуть, а то и больше... З.Ы. Может мне стоит посмотреть в сторону InnoDB? никогда с ней не работал, но... тогда точно для поиска придется не MySQL использовать...
|
|
|
||
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Запрос на бесплатные полезности | 7 | Tia2 | 1981 | 23.3.2024, 11:27 автор: Alexand3r |
|
Оптимизация сайтов, продвижение, наращивание ссылок. Большой опыт работы | 2 | BurzhuyXXi | 1990 | 25.2.2023, 14:37 автор: BurzhuyXXi |
|
Требуются рерайтеры, большой объем работ. | 0 | sodexx1 | 926 | 4.9.2022, 18:55 автор: sodexx1 |
|
Нужны лиды air duct cleaning (Канада, провинция Онтарио, большой Торонто). Приветствуется так же просто подробный хороший план, как лиды получить |
0 | memeplex | 4524 | 3.9.2021, 21:40 автор: memeplex |
|
Нужен кодер php, бюджет не большой ! | 0 | imvaisov | 1339 | 4.7.2020, 16:38 автор: imvaisov |
Текстовая версия | Сейчас: 25.4.2024, 15:52 |