Mailinglisten-Archive |
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