sql >> Database >  >> RDS >> Mysql

Mysql opgeslagen functies en groepsgewijze min

De groupwise max werkt niet gegarandeerd. MariaDB heeft het zelfs gebroken, maar heeft een instelling gegeven om het terug te krijgen. Dit is wat ik bedoel:

SELECT  *
    FROM  
      ( SELECT  ...  ORDER BY ... )
    GROUP BY ...

waar u de eerste (of laatste) in elke groep van de innerlijke query wilt. Het probleem is dat SQL vrij is om die intentie weg te optimaliseren.

De groupwise max-code in de documenten is vreselijk inefficiënt.

Om de zoekopdracht te versnellen, is een waarschijnlijke hulp het isoleren van de Rules of Places deel van de WHERE-component en maak daar een subquery van die alleen de PRIMARY KEY van de bijbehorende tabel retourneert. Zet dat dan in een JOIN met alle tafels (inclusief een JOIN terug naar dezelfde tafel). U heeft al een "covering index" voor die subquery, zodat deze "Using index" kan zijn (in het jargon dat wordt gebruikt door EXPLAIN).

Is innodb_buffer_pool_size ingesteld op ongeveer 70% van het beschikbare RAM-geheugen?

BIGINT duurt 8 bytes; je zou waarschijnlijk kunnen leven met MEDIUMINT UNSIGNED (0..16M). Kleiner --> meer cachebaar --> minder I/O --> sneller.

Het paar DOUBLE's voor lat/lng nemen 16 bytes in beslag. Een FLOAT-paar zou 8 bytes in beslag nemen en een resolutie van 6 voet / 2 m hebben. Of DECIMAAL (6,4) voor breedtegraad en (7,4) voor lengtegraad voor 7 bytes en een resolutie van 52 voet / 16m. Goed genoeg voor "winkels", vooral omdat je een 'vierkant' gebruikt in plaats van een 'cirkel' voor afstand.

Code voor "vind de dichtstbijzijnde ..." is moeilijk te optimaliseren. Dit is het beste dat ik heb bedacht:http://mysql.rjweb.org/doc .php/latlng




  1. Maak een berekende kolom met gegevens uit een andere tabel

  2. Apostrofs en dubbele punten in Pretty Links

  3. Waarom kan ik geen a doen met x als (...) met ADODB en Oracle?

  4. Een Oracle Database 12c maken – Stap voor stap