Вопросы производительности

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
anagamin
Сообщения: 56
Зарегистрирован: 2012.01.19, 12:25

Вопросы производительности

Сообщение anagamin » 2012.02.28, 16:00

Честно говоря, с более менее крупным проектом в Yii столкнулся впервые - на этапе разработки все работало шикарно. Но стоило наполнить контентом (всего по 3000-5000 записей в каждой таблице, все индексы красиво расставлены), скорость упала фактически до нуля.
Даже такие запросы выполняются по 30-50 секунд (связь с helps HAS_MANY, как в учебнике):

Код: Выделить всё

        $criteria = new CDbCriteria();
    $criteria->select='t.*, COUNT(helps.id) as cnt';
    $criteria->with = array('helps');
    $criteria->together=true;
    $criteria->order='cnt DESC';
    $criteria->group='t.id';
    
    
    $users=User::model()->findAll($criteria);
     
Я что-то не так делаю или просто AR реально не расчитан на такие объемы данных?

Аватара пользователя
andy_s
Сообщения: 127
Зарегистрирован: 2012.01.22, 13:15

Re: Вопросы производительности

Сообщение andy_s » 2012.02.28, 16:03

Для начала скопируйте сгенерированный ActiveRecord'ом запрос и запустите его вручную. Есть подозрение, что скорость не будет сильно разниться...

Аватара пользователя
anagamin
Сообщения: 56
Зарегистрирован: 2012.01.19, 12:25

Re: Вопросы производительности

Сообщение anagamin » 2012.02.28, 16:20

Да, действительно. Тогда вопрос шире. Что делать? :)
В таблице hmb_user - 2500 строк, в таблице hmb_help - 56000 строк.
SELECT * FROM hmb_user
0.0004 сек
SELECT * FROM `hmb_user` t LEFT JOIN hmb_help help ON t.id=help.user_id
сервер виснет :)

Аватара пользователя
samdark
Администратор
Сообщения: 9171
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Вопросы производительности

Сообщение samdark » 2012.02.28, 16:33

1. Не выбирайте всё. Если сделать постраничку, будет намного легче.
2. Ключ на t.id=help.user_id есть? Индекс?

Аватара пользователя
anagamin
Сообщения: 56
Зарегистрирован: 2012.01.19, 12:25

Re: Вопросы производительности

Сообщение anagamin » 2012.02.28, 16:40

1. А если цель - сортировка по количеству связанных полей (как в п.1), а не вывод конкретных данных?
2. В смысле, foreign key в самой БД? MyISAM же их не поддерживает. Стоят обычные primary\index

Аватара пользователя
samdark
Администратор
Сообщения: 9171
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Вопросы производительности

Сообщение samdark » 2012.02.28, 16:43

1. Я бы в этом случае чуть денормализовал и писал бы количество отдельным полем, чтобы избежать JOIN.
2. Почему не InnoDB? Для help.user_id есть индекс?

Аватара пользователя
anagamin
Сообщения: 56
Зарегистрирован: 2012.01.19, 12:25

Re: Вопросы производительности

Сообщение anagamin » 2012.02.28, 16:47

1. Часто есть необходимость делать фильтры: количество по определенной дате, количество с определенным статусом и т.п., отдельным полем делать не выйдет.
2. Ну, так исторически сложилось :). Кроме того, насколько я понимаю, foreign keys используются, в основном, для проверки целостности, нежели для ускорения доступа к данным. Да, help.user_id - index.

Аватара пользователя
samdark
Администратор
Сообщения: 9171
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Вопросы производительности

Сообщение samdark » 2012.02.28, 16:53

1. Ок, но LIMIT-то почему не применяем? У вас же не 2500 записей на страницу?

Аватара пользователя
anagamin
Сообщения: 56
Зарегистрирован: 2012.01.19, 12:25

Re: Вопросы производительности

Сообщение anagamin » 2012.02.28, 16:55

1. Для hmb_user - да, применяю.

Хм.. А на агавовском сервере точно такой же запрос на точно таком же дампе выполняется за 0.0015 сек. Конфигурация железа примерно схожая - мистика...

Аватара пользователя
Stamm
Сообщения: 407
Зарегистрирован: 2010.03.14, 18:59
Откуда: Россия, Москва
Контактная информация:

Re: Вопросы производительности

Сообщение Stamm » 2012.02.28, 18:18

Сверьте настройки mysql, и на всякий случай посмотрите explain запроса на разных серверах

Ответить