maximka787
19.11.2012 - 15:01
Ребят, вопрос для меня тяжелый, посоветуйте как быть, если знаете. Есть у меня три таблицы профайлы пользователей, страны и города
users (`id`, `name`, `id_country`, `id_city`); // записей пока 100
country (`id`, `name`); // записей 200
city (`id`, `name`); // записей 1000 с чем то
Все бы ничего, но при наполнении только части!! таблиц, уже упала скорость запросов. Может я не правильно составляю?
SELECT
t1.`name`
FROM
`users` t1,
`country` t2,
`city` t3
WHERE
t1.`id_country` = t2.`id` AND
t1.`id_city` = t3.`id`
Может подсоединением таблиц через LEFT JOIN будет правильней сделать?
_____________
..Работает - не трогай!
Игорь_Vasinsky
19.11.2012 - 15:02
может быть. проверь.
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
alexbel2404
19.11.2012 - 15:17
На t1.`id_country` и t1.`id_city` индексы стоят? Если нет, то поставь
maximka787
19.11.2012 - 15:48
Игорь_Vasinsky
В данном случае LEFT JOIN не упростило ничего.
alexbel2404
Да, индексы стоят и типы полей int unsigned.
Странно, через запрос в phpmyadmin быстро выдает список, а через сайт нет. Может быть, буферизация вывода сайта тормозит, тк все же таблица не маленькая.
Ладно подумаю над этим. Спасибо за поддержку.
_____________
..Работает - не трогай!
sergeiss
19.11.2012 - 16:02
maximka787 - а "долго выполняется" - это сколько по времени? И каким образом ты измерял время?
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
SlavaFr
19.11.2012 - 16:26
1) зачем вообще нужно join с таблицами `country` и `city` если ты ищеш только user.name и не используеш не каких ограничений по таблицам country и city?
2)являются ли user.`id_country` и user.`id_city` foreign key таблиц country и city?
еще лучше вышли 'show create table название_таблицы' выше упомянутых таблиц
3) как уже сказано @sergeiss, не известно как и что ты измерял
возможно база мгновенно зделала свою работу, просто считывать все без исклучения имена из таблицы может занять время и output-buffer.
_____________
↓↓↓↓↓↓↓↓↓↓ответ может быть здесьили в mysql_error();
Invis1ble
19.11.2012 - 16:38
смотри explain'ом план выполнения
кстати, я тут пару дней назад случайно наткнулся на фичу в pma - "профилировать" вроде называется. Так вот, там показаны в виде графика сколько времени занимают различные этапы выполнения запроса - оч. интересная штука =)
_____________
Профессиональная разработка на заказЯ на GitHub |
второй профиль
killer8080
19.11.2012 - 16:52
Цитата (maximka787 @ 19.11.2012 - 14:48) |
Странно, через запрос в phpmyadmin быстро выдает список, а через сайт нет. |
Скорей всего проблема не в этом запросе, а в другом месте.
maximka787
19.11.2012 - 18:04
Да ребят. я разобрался, проблема видимо в буферизации. Сам то запрос выполняется за 0.05 сек, а на сайте расставив время выполнения в разных местах, понял, что сайт выполняется 1,2 секунды как раз между выводом всех городов в <select>options а их там много. Видимо это буферизация и не вмещает сразу все.
SlavaFr
очень интересный и непонятный вопрос.
Цитата |
2)являются ли user.`id_country` и user.`id_city` foreign key таблиц country и city? еще лучше вышли 'show create table название_таблицы' выше упомянутых таблиц |
у меня тип данных MyISAM, внешние ключи там не задействованы, там связь идет по ключам через id_country - id, id_city - id. Связь только логическая, комп не знает что это связующие поля. Разве это не ключи?

Вот структура, от руки написал)
Цитата |
[users] `id` int unsigned not null primary key, `id_country` int unsigned not null, `id_city` int unsigned not null
[country] `id` int unsigned not null primary key, `id_name` varchar(100)
[city] `id` int unsigned not null primary key, `id_name` varchar(100) |
_____________
..Работает - не трогай!