X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Правильный запрос к большой таблице...
1nSane
1nSane
Topic Starter сообщение 13.3.2011, 2:02; Ответить: 1nSane
Сообщение #1


Вопрос простой, есть табличка, в которой сейчас 15 млн записей, а будет еще больше... Весит 800 МБ, было еще индексов на 800МБ, снес один индекс, после пересчета индексы стали занимать 1.2ГБ... странно...

Но вопрос не в этом:
[PHP]<?php $count = mysql_result(mysql_query("SELECT count(*) FROM `files`"),0); ?>
<p>In Our base: <strong><font color='#ff0000'><?php echo $count; ?></font></strong> LIVE files!</p>[/PHP]
Все хорошо, видим кол-во записей, все летает. Но с недавнего времени ввел столбец DEAD с типом enum (0,1) и индексом на поле... решил изменить запрос на
[PHP]<?php $count = mysql_num_rows(mysql_query("SELECT id FROM `files` WHERE dead='0'")); ?>[/PHP]
Таблица падает в Sending Data, работа встряет...
Попробовал:
[PHP]<?php $count = mysql_num_rows(mysql_query("SELECT id FROM `files`")); ?>[/PHP]
Аналогично, все виснет...

Как мне посчитать кол-во "живых" файлов? Есть вариант удалять мертвые файлы, но хочется чтобы о них информация оставалась...
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 13.3.2011, 3:18; Ответить: alexdrob
Сообщение #2


чем плох вариант ?
[PHP]$count = mysql_result(mysql_query("SELECT count(*) FROM `files` WHERE dead='0'"),0);[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
1nSane
1nSane
Topic Starter сообщение 13.3.2011, 3:30; Ответить: 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
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
1nSane
Topic Starter сообщение 13.3.2011, 21:32; Ответить: 1nSane
Сообщение #5


Спасибо за пояснения, тогда индекс снесу... только вот вопрос, как же мне корректно определять количество записей с dead=0? Чтоб не вешать систему... GROUP BY тоже не поможет?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
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
1nSane
Topic Starter сообщение 14.3.2011, 11:57; Ответить: 1nSane
Сообщение #7


В других проектах все ОК с указанием явного значения енума ;) а тормоза тут... все затрудняется тем, что не только поиск мне нужен, но и постоянный UPDATE и INSERT значений, при выборке за 2-5 сек остальное падает в Locked...
с интом попробую...

Может дело не в размере записей? а их кол-ве, у меня уже 20 миллионов и число растет, планируется к концу марта 100 млн достигнуть, а то и больше...

З.Ы. Может мне стоит посмотреть в сторону InnoDB? никогда с ней не работал, но... тогда точно для поиска придется не MySQL использовать...

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Запрос на бесплатные полезности
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


 



RSS Текстовая версия Сейчас: 25.4.2024, 15:52
Дизайн