1 (edited by minde 2006-07-24 22:30:52)

Topic: Uzklausos optimizavimas

Taigi... turiu uzklausa:

SELECT A.ID, KOMENTARAI.KAM, COUNT( * ) 
FROM (
SELECT ID
FROM IMAGES
GROUP BY ID
ORDER BY ID DESC 
LIMIT 30 , 30
) AS A
LEFT JOIN KOMENTARAI ON A.ID = KOMENTARAI.KAM
GROUP BY KOMENTARAI.KAM, A.ID
ORDER BY A.ID DESC

Ji, kiekvienam puslapyje istraukia po 30 (paryskinta) paveiksleliu ir salia kiek jis turi komentaru... istiesu sioji nelabai vykus, kadangi graziau isgauti nepavyko.

Esme yra tame, kad su uzklausa noru istraukti tiek paveikslelio ID, tiek ir komentarus, kad nereiktu naudoti keliu atskiru uzklausu.

Gal turite pasiulymu kaip optimizuoti?  Nes si gan ilgokai uztrunka "Rodomi įrašai 0 - 29 (30 iš viso , Užklausa užtruko 1.6280 sek.)"

Beje, sis variantas toks kreivas del to, jog man reikalingi ir tie ID, kurie nturi komentaru

Re: Uzklausos optimizavimas

La,

Prieš kažką siūlant norėtusi matyti tokius dalykus:

EXPLAIN IMAGES;
EXPLAIN KOMENTARAI;

3 (edited by minde 2006-07-24 21:27:47)

Re: Uzklausos optimizavimas

mysql> EXPLAIN images;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | int(11)     | NO   | PRI | NULL    | auto_increment |
| size      | int(11)     | NO   |     | 0       |                |
| downloads | int(11)     | NO   |     | 0       |                |
| lastuse   | int(11)     | NO   |     | 0       |                |
| type      | varchar(10) | NO   |     | 0       |                |
| comments  | text        | NO   |     | NULL    |                |
| ip        | text        | NO   |     | NULL    |                |
| report    | tinyint(4)  | NO   |     | 0       |                |
| adult     | tinyint(1)  | NO   |     | 0       |                |
+-----------+-------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)
mysql> EXPLAIN komentarai;
+------------+------------+------+-----+---------+----------------+
| Field      | Type       | Null | Key | Default | Extra          |
+------------+------------+------+-----+---------+----------------+
| id         | int(11)    | NO   | PRI | NULL    | auto_increment |
| kas        | text       | NO   |     | NULL    |                |
| date       | text       | NO   |     | NULL    |                |
| time       | text       | NO   |     | NULL    |                |
| komentaras | longtext   | NO   |     | NULL    |                |
| email      | text       | NO   |     | NULL    |                |
| web        | text       | NO   |     | NULL    |                |
| kam        | int(11)    | NO   |     | 0       |                |
| adm        | tinyint(1) | YES  |     | NULL    |                |
+------------+------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)

uf, tikiuosi suprantama :-)

IMAGES.ID = KOMENTARAI.KAM

Re: Uzklausos optimizavimas

;) Toks greitas ir elementarus "optimizavimas" tai būtų: uždėti INDEX'ą ant komentarai.KAM lauko.

O toliau dar reikia pažiūrėt.

p.s.: dėdamas užklausas ar jų rezultatus naudok BBKodą ;)

Re: Uzklausos optimizavimas

Je! Aciu! Kreiva uzklausa gan greita pasidare :-)
Rodomi įrašai 0 - 29 (30 iš viso , Užklausa užtruko 0.0011 sek.)

Re: Uzklausos optimizavimas

Ir dar vienas pastebėjimas. Užklausoje yra tokios eilutės:

LEFT JOIN KOMENTARAI ON A.ID = KOMENTARAI.KAM

ir

GROUP BY KOMENTARAI.KAM, A.ID

Kodėl yra grupuojama pagal abu laukus? Manau užtektu tik pagal vieną iš jų.

Re: Uzklausos optimizavimas

Tiesa... :-)
Uztenko ir

GROUP BY A.ID

Re: Uzklausos optimizavimas

Na ir galutinis rezultatas uztruko kiek laiko?

SELECT * FROM users WHERE gender = 'female' AND size > 'enough' AND leftsize = rightsize AND age >= 18 AND age < 30 LIMIT 1

Re: Uzklausos optimizavimas

Manau, kad tiek pat ;) Tas papildomas grupavimas tikriausiai buvo suoptimizuotas ir papildomai laiko neužėmė.

Re: Uzklausos optimizavimas

Tikrai taip, galutinio rezultato neitakojo :-)