|
|
|
|
|
для: cheops
(18.05.2011 в 01:03)
| | Спасибо огромное, очень помогли. | |
|
|
|
|
|
|
|
для: iv4art
(17.05.2011 в 23:10)
| | Если таблицы небольшие, до 1Мб один многотабличный запрос будет производительнее множества однотабличных, если таблицы будут большие - все наоборот. Это от настроек MySQL зависит - как только запрос отправляется во временную таблицу на жестком диске - производительность сильно страдает. | |
|
|
|
|
|
|
|
для: cheops
(17.05.2011 в 21:07)
| | Хм. Сам не догадался, спасибо.
А на счёт второго: сильно ли понижается производительность при большом количестве запросов к базе? Т. е. какое нормальное количество запросов для одного скрипта: 5, 10, 100? Ведь если запросы занимают много ресурсов, то при высокой активности пользователей на сайте серверу будет всё сложнее справляться. Или запросы к базе настолько нересурсоёмкие, что можно и не стараться на них экономить? Просто когда читал описание к DataLifeEngine, там акценитровалось внимание на том, что каждый скрипт CMS делает не более 5 запросов к базе. У меня с тех пор пунктик по этому поводу. | |
|
|
|
|
|
|
|
для: iv4art
(17.05.2011 в 20:30)
| | >Каким образом сформировать каталог при помощи такого запроса?
А что вызывает сложности? То что записи относительно каталога повторяются? Если да, то нужно просто завести переменную и в которую сохранять название или идентификатор каталога, как только в очередной записи будет отличный идентификатор или название - происходит смена каталога: нужно вывести название и обновить содержимое промежуточной переменной.
>На мой взгляд это не круто
Круто или нет покажет время - многотабличные запросы - это декартово произведение таблиц, т.е. вместо двух таблиц grup1 и grup2 у вас появляется одна таблица с количеством записей равных произведению количества строк в этих таблицах. Эта большая таблица, если не убирается в оперативной памяти, как вы догадываетесь сначала записывается на жесткий диск, а потом из неё отбираются нужные по WHERE-условию записи. Поэтому с форумом такая политика не пройдет: все что можно - вычислить заранее, где можно, используем хорошо-кэшируемые однотабличные запросы. | |
|
|
|
|
|
|
| Дано: три таблицы, в которых содержится каталог магазина:
GRUP1 — типы товаров, поля ID и NAME;
GRUP2 — категории товаров, привязаны к типу ID, NAME, ID_GRUP1;
TOVAR — собственно товары, привязаны к категориям ID, NAME, ID_GRUP2.
В настоящее время каталог формируется по следующему принципу:
$query_types = mysql_query("SELECT * FROM GRUP1");
if($query_types){
while($types = mysql_fetch_array($query_types)){
echo("<h1>".$types["NAME"]."</h1>");
$query_categories = mysql_query("SELECT * FROM GRUP2 WHERE ID_GRUP1=".$types["ID"]);
if($query_categories){
while($categories = mysql_fetch_array($query_categories)){
echo("<а хреф='items.пхп?category=".$categories["ID"].">".$categories["NAME"]."</а><br>");
}
} else {
echo(mysql_error());
}
}
} else {
echo(mysql_error());
}
|
По переходу по ссылкам скрипт итемс.пхп формируем список товаров из таблицы TOVAR, где ID_GRUP2=$_GET["category"].
Такой же принцип использовался при разработке этого форума, насколько я могу судить по книге «PHP5. Создание web-сайтов». На мой взгляд это не круто, потому что чем больше у типов товаров (записей в таблице GRUP1), тем больше запросов при формировании каталога. Я пытаюсь сформировать каталог с помощью одного многотабличного запроса:
SELECT GRUP1.ID AS grup1id, GRUP1.NAME AS grup2name, GRUP2.ID AS grup2id, GRUP2.NAME AS grup2name FROM grup1,grup2 WHERE grup2.ID_GRUP1=grup1.ID
|
Каким образом сформировать каталог при помощи такого запроса? | |
|
|
|
|