codez Posted October 15, 2008 Report Share Posted October 15, 2008 (edited) Varbūt te kāds ir ņēmies ar spatial indexiem un zinās kas un kā jādara. Ir tabula: id integer pos point n integer spatial index ar pos. Vajag dabūt 10 punktus ar lielākajām n vērtībām noteikta daudzstūra iekšienē. Šis kverijs to dara: SELECT id,AsText(pos),n FROM ge WHERE MBRContains(GeomFromText('Polygon((5 5,8 5,8 8,5 8,5 5))'),pos) ORDER BY n desc LIMIT 10 ; Bet, EXPLAIN rāda: 1, 'SIMPLE', 'ge', 'range', 'Index_2', 'Index_2', '32', '', 60, 'Using where; Using filesort' Ja datubāzē būs miljons ieraksti, tad šis "Using filesort", noteiktos gadījumos būs pavisam neskaists. Vai kāds nezin kādu labu vafiantu, kā šo problēmu varētu atrisināt bez filesort? Edited October 15, 2008 by codez Link to comment Share on other sites More sharing options...
Aleksejs Posted October 16, 2008 Report Share Posted October 16, 2008 Un ir arī indekss uz n? Kas notiek ar EXPLAIN, ja noņem ORDER BY daļu nost? Link to comment Share on other sites More sharing options...
codez Posted October 16, 2008 Author Report Share Posted October 16, 2008 Uz n ir atsevišķs BTREE indeks, jo integer laukus nevar pielikt SPATIAL indeksam. Bez ORDER BY, viss ir jauki, tā ka tam jābūt, apskatīti tiek tikai 10 ieraksti: EXPLAIN SELECT id,AsText(pos),n FROM ge WHERE MBRContains(GeomFromText('Polygon((5 5,8 5,8 8,5 8,5 5))'),pos) LIMIT 10 ; 1, 'SIMPLE', 'ge', 'range', 'Index_2', 'Index_2', '32', '', 10, 'Using where' Link to comment Share on other sites More sharing options...
Aleksejs Posted October 16, 2008 Report Share Posted October 16, 2008 Hmm... Nu, ja nevar abus laukus ielikt vienā indexā... tad nezinu... Papēti, kas te rakstīts: http://hackmysql.com/case5 Link to comment Share on other sites More sharing options...
Recommended Posts