Mysql
 sql >> Base de données >  >> RDS >> Mysql

Fonctions stockées MySQL et groupwise min

Le groupwise max n'est pas garanti de fonctionner. En fait, MariaDB l'a cassé, mais a fourni un paramètre pour le récupérer. Voici à quoi je fais référence :

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

où vous voulez le premier (ou le dernier) de chaque groupe à partir de la requête interne. Le problème est que SQL est libre d'optimiser cette intention.

Le code groupwise max dans la documentation est terriblement inefficace.

Pour accélérer la requête, une aide probable consiste à isoler les Rules ou Places une partie de la clause WHERE et transformez-la en une sous-requête qui renvoie uniquement la CLÉ PRIMAIRE de la table correspondante. Ensuite, mettez cela dans un JOIN avec toutes les tables (y compris un JOIN vers la même table). Vous avez déjà un « index de couverture » ​​pour cette sous-requête afin qu'il puisse être « Utilisation de l'index » (dans le jargon utilisé par EXPLAIN).

Est-ce que innodb_buffer_pool_size est défini sur environ 70 % de la RAM disponible ?

BIGINT prend 8 octets; vous pourriez probablement vivre avec MEDIUMINT UNSIGNED (0..16M). Plus petit --> plus pouvant être mis en cache --> moins d'E/S --> plus rapide.

La paire de DOUBLE pour lat/lng prend 16 octets. Une paire FLOAT prendrait 8 octets et aurait une résolution de 6 pieds / 2 m. Ou DECIMAL(6,4) pour la latitude et (7,4) pour la longitude pour 7 octets et une résolution de 52 pieds / 16m. Assez bon pour les "magasins", d'autant plus que vous utilisez un "carré" au lieu d'un "cercle" pour la distance.

Le code pour "trouver le plus proche ..." est difficile à optimiser. Voici le meilleur que j'ai trouvé :http://mysql.rjweb.org/doc .php/latlng