sql >> Databasteknik >  >> RDS >> Mysql

Mysql lagrade funktioner och gruppvis min

Gruppvis max är inte garanterat att fungera. Faktum är att MariaDB bröt den, men gav en inställning för att få tillbaka den. Det här är vad jag syftar på:

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

där du vill ha den första (eller sista) i varje grupp från den inre frågan. Problemet är att SQL är gratis att optimera bort den avsikten.

Den gruppvisa maxkoden i dokumenten är fruktansvärt ineffektiv.

För att påskynda sökningen är en trolig hjälp att isolera Rules eller Places del av WHERE-satsen och gör den till en underfråga som bara returnerar PRIMARY KEY för motsvarande tabell. Lägg sedan in det i en JOIN med alla tabeller (inklusive en JOIN tillbaka till samma tabell). Du har redan ett "täckande index" för den underfrågan så att det kan vara "Using index" (i den jargong som används av EXPLAIN).

Är innodb_buffer_pool_size inställd på cirka 70 % av tillgängligt RAM?

BIGINT tar 8 byte; du skulle förmodligen kunna leva med MEDIUMINT UNSIGNED (0..16M). Mindre --> mer cachebart --> mindre I/O --> snabbare.

Paret DOUBLE för lat/lng tar 16 byte. Ett FLOAT-par skulle ta 8 byte och ha 6 fot/2m upplösning. Eller DECIMAL(6,4) för latitud och (7,4) för longitud för 7 byte och en upplösning på 52 fot/16 m. Tillräckligt bra för "butiker", särskilt eftersom du använder en "fyrkant" istället för en "cirkel" för avstånd.

Koden för "hitta närmaste ..." är svår att optimera. Här är det bästa jag har kommit på:http://mysql.rjweb.org/doc .php/latlng




  1. PostgreSQL returnerar resultatet satt som JSON-array?

  2. Skapa en GeoJson i php från MySql att använda med MapBox javascript API

  3. Hur man ändrar en kolumns datatyp i SQL Server (T-SQL)

  4. Vad betyder ett kolon före en bokstavlig i en SQL-sats?