phpbar.de logo

Mailinglisten-Archive

Mal wieder das Order By Problem: filesort statt index

Mal wieder das Order By Problem: filesort statt index

Jan Varwig janvarwig@gmx.net
Thu Nov 28 17:13:15 2002


Hallo mysql-de,

Bezug: Mail "AW: Mal wieder das Order By Problem: filesort statt index" vom 28.11.2002 16:17

>>> where news.summary like '%zelda%' or news.full like '%zelda%'
> Auf keine der Spalten ist ein Index gelegt.
habe das jetzt geändert in "where match(subject,full)
against('suchbegriff')" und natürlich die fulltext indizes erzeugt.
Trotzdem funktionert order by <indizierte spalte> nicht.
Details siehe unten.

> Die Benutzung des Index ist Abhängig vom Aufbau der Wherebedingung,
> nicht vom "order by".
MySql kann aber Einträge nach Index sortieren, dann steht in der
letzten Spalte von explain "using index" statt "using filesort".
Merkwürdigerweise macht mysql das, wenn ich "limit [# kleiner als
anzahl_der_reihen]" dahinter klemme (allerdings auch nicht immer:).
Alles sehr sehr merkwürdig.
Ich habe ja erzählt, dass die gleichen Faxen auch bei simplen Abfragen
passieren:
Im Moment umfaßt "news" 1202 Einträge
select * from news order by time -> filesort
select * from news order by time limit 1201 -> kein filesort

In den Changes 3.23.37  -> 3.23.38 steht:
  Changed optimiser so that queries like SELECT * FROM
  tbl_name,tbl_name2 ... ORDER BY key_part1 LIMIT # will use index on
  key_part1 instead of filesort.

Ausserdem, bei 5.7.2 How MySql optimizes ORDER BY gefunden:
  Some cases where MySQL can not use indexes to resolve the ORDER BY:
    The key used to fetch the rows are not the same one that is used to do
    the ORDER BY: SELECT * FROM t1 WHERE key2=constant ORDER BY key1

Wieso aber wird filesort bei der kompletten Tabelle angewendet?

...
halbe stunde mysql-referenz studieren und mit explain rumspielen
...

Gnarf! So richtig Sinn ergibt das alles nicht, aber ich glaube ich
blicke langsam durch:
Wie es scheint, wird nur dann nach einem index sortiert, wenn dieser auch
in der where-bedingung verwendet wird oder wenn die zahl der
ergebnisse durch limit begrenzt ist. Wenn in der where-klausel ein
anderer index, ein überhaupt nicht indiziertes feld oder eine funktion
verwendet wird oder wenn "order by" ohne "where" benutzt wird, greift
mysql auf filesort zurück. Inwieweit das sinnvoll ist bleibt fraglich.

Wäre cool, wenn jemand diese Theorie noch bestätigen könnte, aber
trotzdem erstmal danke für die bisherigen Antworten.


mfg

Jan Varwig


--------------------------------------------
Die aktuelle Tabelle + select statement:

CREATE TABLE `news` (
  `nid` bigint(4) NOT NULL auto_increment,
  `subject` varchar(50) NOT NULL default '',
  `source` tinytext NOT NULL,
  `summary` text NOT NULL,
  `full` longtext NOT NULL,
  `aid` varchar(30) NOT NULL default '',
  `time` datetime NOT NULL default '0000-00-00 00:00:00',
  `gid` varchar(10) NOT NULL default '',
  PRIMARY KEY  (`nid`),
  KEY `news_time` (`time`),
  KEY `news_gid` (`gid`),
  FULLTEXT KEY `news_sub_full` (`subject`,`full`)
) TYPE=MyISAM

select nid, subject, length(full) as length, unix_timestamp(time) as time
  from news where match(news.subject,news.full) against('$search')

  (sortierung automatisch nach trefferquote)


-- 
"Wo das Irrenhaus ist?" war wieder Arkanum Jill Watson
zu hören. "Haben sie jemals die Gebrauchsanleitung auf
einem Päckchen Zahnstocher gelesen?" - Douglas Adams
Jan Varwig janvarwig@gmx.net


-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive