Forum Webscript.Ru
Общие => Базы данных => Тема начата: Антошка от 16 Июня 2004, 18:39:10
-
Таблица 100000 записей (сто тысяч) следственно примерно так
НОМЕР КАТЕГОРИЯ НАЗВАНИЕ ОПИСАНИЕ
категорий 23 штуки, все в разнобой
делаю у себя на компе все по этому сразу понимаю что не быстро должно работать но не настолько... итак:
задача вывести категории и следственно сколько записей в категории
mysql_query("SELECT categor, id, COUNT(categor) FROM `$table` GROUP BY categor");
вот примерно так забираю
время вывода страницы в районе 5-6 минут при этом процесс Mysql душит иные процессы на Free и забирает 80-85% проца на это время.
подумал....
сделал индекс на поле categor, по описалову должно бы все стать очень быстро (особенно если учесть что из 200мб базы, она стала 240мб, тока индексы на 40 метров)
но процесс стал быстрее но все также хренова 3-4 минуты.
У хостера все будет быстрее не сомневаюсь, но так как предполагается достаточно активная нагрузка, то боюсь он это не одобрит
вопрос чем можно помочь сейчас?
один из вариантов сделать еще табличку туда затащить все категории и по CRON запускать пересчет кол-во записей раз в сутки. Но кроме этого?
-
если ты хочешь что-бы тебе поногли... выведи свои таблицы примерно в таком формате... :
create table test
(
test_id int,
test_name varchar(1)
);
А то по твоему прищуренному эссе ничего не понятно... кроме того что ты очень гордишся что у тебя большая БД... хотя не такая она и большая...
-
во-первых, запрашивать id в таком запросе бесполезно
во-вторых, отлаживать запросы надо в консоли, а не выводя на страницу.
в-третьих, приведи здесь результат вывода вот такого запроса
EXPLAIN SELECT categor, COUNT(categor) FROM имя_таблицы GROUP BY categor
-
commander:
если ты хочешь что-бы тебе поногли... выведи свои таблицы примерно в таком формате... :
create table test
(
test_id int,
test_name varchar(1)
);
А то по твоему прищуренному эссе ничего не понятно... кроме того что ты очень гордишся что у тебя большая БД... хотя не такая она и большая...
Пожалуйста...
CREATE TABLE `tm_books` (
`id` int(11) NOT NULL default \'0\',
`categor` varchar(255) binary NOT NULL default \'\',
`nazvanie` varchar(255) binary NOT NULL default \'\',
`data` year(4) NOT NULL default \'0000\',
`cena` decimal(8,2) NOT NULL default \'0.00\',
`url` varchar(255) NOT NULL default \'\',
`kratko` text NOT NULL,
`image` text NOT NULL,
PRIMARY KEY (`id`),
KEY `categor` (`categor`)
) TYPE=MyISAM PACK_KEYS=0;
а можно для самообразования, узнать в каком месте у меня фразы гордости что большая база?
база не большая не маленькая.. да действительно есть базы и гиговые, а есть и килобайтные, для большиства база на 200 метров все таки большая...
-
RomikChef:
во-первых, запрашивать id в таком запросе бесполезно
дык, я потом использую его...
правда выкинув его нахрен время запроса сократилось с 33 секунд, до 9....
вот видимо и ответ ;))
без всяких понтов
RomikChef:
во-вторых, отлаживать запросы надо в консоли, а не выводя на страницу.
да я отлаживаю в консоле... просто enn я отладил все что мог, как я думал ;(
RomikChef:
в-третьих, приведи здесь результат вывода вот такого запроса
EXPLAIN SELECT categor, COUNT(categor) FROM имя_таблицы GROUP BY categor
table type possible_keys key key_len ref rows Extra
tm_books index NULL categor 255 NULL 78573 Using index
-
обычно делают таблицу с категориями :
create Categories (
cat_id int unsigned not null auto_increment,
category varchar(32),
primary key (cat_id)
);
и в таблице tm_books хранят не название категории а ее cat_id
Тебе вообще знакомо такое понятие как "нормализация" ?
-
Зачем тебе в category аж 255 символов ?
-
Антошка:
дык, я потом использую его...
Видишь ли, милый.
Я не спорю с тем, что ты его используешь.
просто я говорю о том, что использовать его быссмысленно.
с тем же успехом ты можешь просто генерить случайное число
`image` text NOT NULL,
ОХРЕНЕТЬ!
этот ... ... ... изобретатель хранит картинку в базе, а потом удивляется - откуда размеры и тормоза!
-
RomikChef:
ОХРЕНЕТЬ!
этот ... ... ... изобретатель хранит картинку в базе, а потом удивляется - откуда размеры и тормоза!
охренеть делать выводы.... по имени столбцу
а почему вы не думали что там лежит примерно это...
причем ALT может быть до 400 символов...
следственно в VARCHAR ну никак не запихнуть...
-
Макс:
Зачем тебе в category аж 255 символов ?
в принципе 255 не надо... в районе 150 заканчивается имя категории, а что если сделать не 255 а 150 поможет?
-
Макс:
Тебе вообще знакомо такое понятие как "нормализация" ?
Да только к чему это здесь? Вот цитата из БСЭ
Нормализация
(франц. normalisation - упорядочение, от normal - правильный, положенный), вид термической обработки стали, заключающийся в нагреве её выше верхней критической точки, выдержке при этой температуре и последующем охлаждении на спокойном воздухе. Цель Н. - придание металлу однородной мелкозернистой структуры (не достигнутой при предыдущих процессах - литье, ковке или прокатке) и как следствие - повышение его механических свойств (пластичности и ударной вязкости).
-
поможет:
ограничить все варчар поля нужным размером и сделать их char
все текст поля вынести в отдельную таблицу!
не хранить в базе ОФОРМЛЕНИЕ, а хранить ТЕКСТЫ
я не удивлюсь, что альт из имижда копирует содержимое поля кратко.
альт сократить максимум символов до 50.
-
Антошка:
Да только к чему это здесь? Вот цитата из БСЭ
ты бы еще словарь Даля открыл :)
Антошка:
, а что если сделать не 255 а 150 поможет?
если и поможет, то только временно. Правильное решение - нормализовать БД.
Что такое номализация читай у Криса Дейта. Ну или хотя бы в яндексе.
-
RomikChef:
поможет:
ограничить все варчар поля нужным размером и сделать их char
все текст поля вынести в отдельную таблицу!
не хранить в базе ОФОРМЛЕНИЕ, а хранить ТЕКСТЫ
я не удивлюсь, что альт из имижда копирует содержимое поля кратко.
альт сократить максимум символов до 50.
если бы было все так просто, то естественно не хранил-бы и даже не спрашивал...
и альт и место где лежит картинка легли бы в разные поля... и стали-бы на порядок короче, только так отдает партнер и лично под нас менять он ничего не намерен...
-
Спасибо всем, последовал разным рекомендациям...
1. Убрал id из запроса время запроса упало с 33 сек до 11-9 сек
2. Переменная Varchar(255), сменилась на char(100) с 11 секунд, до 0,5 сек.
Что уже более чем хорошо.