|
Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема
|
MySQL- bavno query
|
|
Автор | x (Нерегистриран) |
Публикувано | 02.04.03 20:22 |
|
Imam slednata tablica:
CREATE TABLE docinfn (cl_id INT UNSIGNED,
doc_id INT UNSIGNED NOT NULL,
word_id INT UNSIGNED NOT NULL,
weight INT UNSIGNED NOT NULL,
tf INT UNSIGNED NOT NULL,
cl0 INT UNSIGNED,
cl1 INT UNSIGNED,
cl2 INT UNSIGNED,
cl3 INT UNSIGNED,
KEY(cl_id), KEY(doc_id),
KEY(word_id), KEY(cl0),
KEY(cl1), KEY(cl2), KEY(cl3));
Izpylniavam slednata zayavka vyrhu taya tablica:
SELECT doc_id, SUM(weight)
FROM docinfn
WHERE (word_id IN (1, 2, 3)) AND (cl0 <> 50) AND (doc_id NOT IN (50, 60, 70))
GROUP BY doc_id
ORDER BY 2 DESC
LIMIT 100;
Kakvi dopylnitelni indexi triabva da pusna, 4e da uskoria neshtata (imam okolo 30 000 000 zapisa)? Ima li na4in da se oprimizira zayavkata?
Probval sym s edin dopylnitelen index KEY(word_id, cl0) i kato izpylnig slednata zayavka:
SELECT doc_id, SUM(weight)
FROM docinfn
WHERE (word_id IN (1, 2, 3)) AND (cl0 <> 50)
GROUP BY doc_id
ORDER BY 2 DESC
LIMIT 100;
Neshtata ne se uskoriha, a az o4akvah da ima goliama razlika. Dopylnitelnite indexi syshto dosta zabaviat INSERT-ite, koeto e i logino.
Iskam da dopylnia, 4e zayavkata moje da se razli4ava malko. Primerno v zayavkata moje da prisystva i cl1, cl2, cl3 ili nito edno da ne prisystva
(vklu4itelno i cl0), t.e. v dopylnenie na gornata zayavka v klauzata WHERE moje da imam neshto ot vida na: + cl1 <> xxx AND cl2 <>zzz
AND cl3<>qqq.
(doc_id NOT IN (50, 60, 70))- poniakoga moje i da ne prisystva v zayavkata. Zayavkata ya generiram dinami4no.
Mersi predvaritelno.
| |
Тема
|
Re: MySQL- bavno query
[re: x]
|
|
Автор |
ro6avia (mnogo ro6avia) |
Публикувано | 02.04.03 21:39 |
|
po moeto skromno mnenie i to ne mnogo very high profesional
predlagam ti tova :
create temp_table SELECT * FROM docinfn WHERE
(word_id IN (1,2,3)//tova po-dobre taka (word_id=1 or word_id=2 or word_id=3)
) AND (cl0 <> 50)
AND (doc_id NOT IN (50, 60, 70)) // kato gornoto
i posle vtoro query :
SELECT doc_id, SUM(weight) FROM temp_table
GROUP BY doc_id
ORDER BY 2 DESC
LIMIT 100;
E tuk ni6to niama :
| |
|
drop temp_table of course :-)))
kato temp table moze da ti e slu4aino generiran string ako ima6 konkurentni zaiavki online
E tuk ni6to niama :
| |
Тема
|
Re: то затова има TEMPORRAY
[re: ro6avia]
|
|
Автор |
salle (минаващ) |
Публикувано | 02.04.03 22:13 |
|
за да не се кривиш със случайни имена и да се чудиш зали няма да съвпаднат.
CREATE TEMPORARY TABLE xx ...;
| |
Тема
|
лошо, лошо
[re: x]
|
|
Автор | baj l\bo (Нерегистриран) |
Публикувано | 03.04.03 04:02 |
|
Отрицателната логика не позволява използването на индекси. Напр.
AND (cl0 <> 50)
означава че никога няма да използва индекс в/у цл0, а
AND (doc_id NOT IN (50, 60, 70)
не позволява да се използва индекс в/у док_ид
| |
Тема
|
Re: MySQL- bavno query
[re: ro6avia]
|
|
Автор | x (Нерегистриран) |
Публикувано | 03.04.03 12:31 |
|
Mersi za otgovora. Zna4i probvah zayavkite deto si gi dal i rezultatyt e slednia. Moite zayavki, koito sa ekvivalentni na tvoite se izpylniavat za okolo 3-4 pati po-byrzo ot tvoite.
Mnogo vreme se gubi pri syzdavaneto na vremennata tablica. SELECT-a vyv vremennata tablica otnema 1/2 ot vremeto za izpylnenie na moyata zayavka.
| |
Тема
|
Re: MySQL- bavno query
[re: x]
|
|
Автор |
salle (минаващ) |
Публикувано | 03.04.03 13:25 |
|
А ти временната таблица без индекси ли я създаваш?
| |
Тема
|
Re: MySQL- bavno query
[re: x]
|
|
Автор |
salle (минаващ) |
Публикувано | 03.04.03 13:33 |
|
Обърни внимание на това, което baj l\bo ти е написал и помисли дали няма начин да обърнеш логиката на "положителна" ако разпределението на стойностите ти го позволява.
т.е. или да изброиш останалите или да го направиш със JOIN
В много случаи примерно е възможно
a <> now() да се замени със a < now() и това да ускопри значително нещата праста защото първото не може да използва индекс а второто може.
Също така може да се окаже много по-бързо да използваш UNION за да разбиеш заявката на парчета с различни WHERE клаузи.
Изчети също какво означават резултатите от EXPLAIN - това е най-доброто другарче при оптимизиране.
Между другото защо нямаш Primary Key ?
| |
Тема
|
Re: MySQL- bavno query
[re: salle]
|
|
Автор | x (Нерегистриран) |
Публикувано | 03.04.03 14:52 |
|
Da bez indexi, no tova ne e ot zna4enie poneje parvoto query, t.e.
create temp_table SELECT * FROM docinfn WHERE
(word_id IN (1,2,3)) AND (cl0 <> 50)
AND (doc_id NOT IN (50, 60, 70))
mi otnama mnogo po-ve4e vreme otkolkoto moeto.
Daje i kato mahna 4asta AND (cl0 <> 50)
AND (doc_id NOT IN (50, 60, 70)).
Ako pusna indexi na vremennata tablica INSERT-ite shte se zabaviat mnogo a SELECTA shte se uskori i v krayna smetka sashtata rabota shte se polu4i.
| |
Тема
|
Re: MySQL- bavno query
[re: x]
|
|
Автор |
salle (минаващ) |
Публикувано | 03.04.03 15:23 |
|
Я кажи колко е:
SELECT COUNT(*) FROM docinfn WHERE word_id IN (1,2,3);
word_id е индексирано та това трябва да е бързичко.
А също и:
SELECT COUNT(*), COUNT(DISTINCT word_in), COUNT(DISTINCT c10), COUNT(DISTINCT doc_id) FROM docinfn;
Това обаче ще е доста по-бавно
| |
|
Страници по тази тема: 1 | 2 | >> (покажи всички)
|
|
|