|
Тема |
Re: MySQL Question [re: exodus] |
|
Автор |
salle (Един такъв) |
|
Публикувано | 13.02.02 19:34 |
|
|
А стига бе. Допреди малко обяснявах точно този случай на един в IRC
Значи решенията са 2
1. TEMPORARY TABLE - доста приятно работят в MySQL
2. Денормализирана структура със втора таблица - там пък трябва да се грижиш за синхронизацията, но пък е значително по-бърз вариант при големи таблици.
Малко забележки преди това:
* Избягвай да използваш резервирани думи като timestamp за имена на колони - просто като стил на писане. Спестява главоболия
* Препоръчвам ти enum('no', 'yes') вместо y, n - enum в някои ситуазии може да работи като масив с индекс от 0 . т.е. ще получиш 0->no, 1->yes
* Задължително индексирай timestamp, а също и productID - EXPLAIN ще ти каже защо :)
1. всъщност симулира работата на subselect
1. create temporary table temp select downloadID, productID, max(timestamp) as ts where isUpdate = yes group by productID;
select ... Ами тука се надявам да се сетиш как да направиш join между твоята таблица и temp :)
подсказка select ... from temp, tbl where temp.ts = tbl.timestamp ...;
2. Същото това нещо на практика обаче със "постоянна" таблица
наречена примерно snapshot (downloadID, productID, timestamp)
И всеки път когато правиш INSERT в твоята си таблица (тя вече се превръща в чиста История на Промените)
правиш и REPLACE в Snapshot-a
Това определено печели време
А ако искаш да събереш двата резултата един след друг това не не работа за subselect а за UNION какъвто вече се подържа в mysql 4.0.x :)
Да ти обяснявам ли какво да направиш със 2) или сам ще се сетиш?
Linux is like a wigwam - No Windows, No Gates, Apache inside
|
| |
|
|
|