Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Funções armazenadas do MySQL e min de groupwise


O groupwise max não é garantido que funcione. Na verdade, o MariaDB o quebrou, mas forneceu uma configuração para recuperá-lo. É a isso que me refiro:
SELECT  *
    FROM  
      ( SELECT  ...  ORDER BY ... )
    GROUP BY ...

onde você deseja o primeiro (ou último) em cada grupo da consulta interna. O problema é que o SQL é livre para otimizar essa intenção.

O código groupwise max nos documentos é terrivelmente ineficiente.

Para acelerar a consulta, uma ajuda provável é isolar as Rules ou Places parte da cláusula WHERE e transformá-la em uma subconsulta que retorna apenas a PRIMARY KEY da tabela correspondente. Em seguida, coloque isso em um JOIN com todas as tabelas (incluindo um JOIN de volta para a mesma tabela). Você já tem um "índice de cobertura" para essa subconsulta para que possa ser "Usando índice" (no jargão usado por EXPLAIN).

O innodb_buffer_pool_size está definido para cerca de 70% da RAM disponível?

BIGINT leva 8 bytes; você provavelmente poderia viver com MEDIUMINT UNSIGNED (0..16M). Menor --> mais armazenável em cache --> menos E/S --> mais rápido.

O par de DOUBLEs para lat/lng ocupa 16 bytes. Um par FLOAT levaria 8 bytes e teria resolução de 6 pés / 2m. Ou DECIMAL(6,4) para latitude e (7,4) para longitude para 7 bytes e uma resolução de 52 pés / 16m. Bom o suficiente para "lojas", especialmente porque você está usando um 'quadrado' em vez de um 'círculo' para distância.

Código para "encontrar o mais próximo ..." é difícil de otimizar. Aqui está o melhor que encontrei:http://mysql.rjweb.org/doc .php/latlng