Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mysql gespeicherte Funktionen und gruppenweise min

Das Groupwise Max funktioniert nicht garantiert. Tatsächlich hat MariaDB es kaputt gemacht, aber eine Einstellung bereitgestellt, um es zurückzubekommen. Darauf beziehe ich mich:

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

wo Sie den ersten (oder letzten) in jeder Gruppe aus der inneren Abfrage haben möchten. Das Problem ist, dass SQL diese Absicht frei optimieren kann.

Der Groupwise-Max-Code in der Dokumentation ist schrecklich ineffizient.

Um die Abfrage zu beschleunigen, ist es wahrscheinlich hilfreich, die Rules zu isolieren oder Places Teil der WHERE-Klausel und machen Sie daraus eine Unterabfrage, die nur den PRIMARY KEY der entsprechenden Tabelle zurückgibt. Fügen Sie das dann in einen JOIN mit allen Tabellen ein (einschließlich eines JOIN zurück zu derselben Tabelle). Sie haben bereits einen "überdeckenden Index" für diese Unterabfrage, sodass sie "Index verwenden" (in der von EXPLAIN verwendeten Fachsprache) sein kann.

Ist innodb_buffer_pool_size auf etwa 70 % des verfügbaren RAM eingestellt?

BIGINT benötigt 8 Bytes; Sie könnten wahrscheinlich mit MEDIUMINT UNSIGNED (0..16M) leben. Kleiner --> cachefähiger --> weniger I/O --> schneller.

Das DOUBLE-Paar für lat/lng nimmt 16 Bytes ein. Ein FLOAT-Paar würde 8 Bytes benötigen und eine Auflösung von 6 Fuß / 2 m haben. Oder DECIMAL(6,4) für den Breitengrad und (7,4) für den Längengrad für 7 Bytes und eine Auflösung von 52 Fuß / 16 m. Gut genug für "Geschäfte", zumal Sie ein "Quadrat" anstelle eines "Kreises" für die Entfernung verwenden.

Code für „den nächsten finden …“ ist schwer zu optimieren. Hier ist das Beste, was mir eingefallen ist:http://mysql.rjweb.org/doc .php/latlng