codez Posted October 15, 2008 Report 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
Aleksejs Posted October 16, 2008 Report Posted October 16, 2008 Un ir arī indekss uz n? Kas notiek ar EXPLAIN, ja noņem ORDER BY daļu nost?
codez Posted October 16, 2008 Author Report 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'
Aleksejs Posted October 16, 2008 Report 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
Recommended Posts