Heim  >  Fragen und Antworten  >  Hauptteil

MySql/MariaDB: Indizes „direkt“ in Abfragen verwenden?

Ich habe mich gefragt, ob es mit MySql/MariaDB möglich ist, Indizes direkt in Abfragen zu verwenden. Nehmen wir an, wir haben eine einfache unsortierte Tabelle mit Zeitstempel-/Wertpaaren:

CREATE TABLE simple (timestamp DATETIME, val INT);

Index durch Hinzufügen eines Zeitstempels:

ALTER TABLE simple ADD INDEX ind_ts (timestamp);

Wir können schnell auf eine sortierte Reihenfolge der Zeitstempel zugreifen.

Lassen Sie uns eine Abfrage definieren, um die Wertedifferenz für aufeinanderfolgende Werte bereitzustellen:

SELECT 
    c.timestamp AS currenttimestamp,
    COALESCE(b.timestamp,'0000-00-00 00:00:00') AS timestampbefore,
    c.val - COALESCE(b.val,0) AS difference
FROM simple c, 
simple b 
WHERE b.timestamp = (SELECT MAX(timestamp) FROM simple h WHERE h.timestamp < c.timestamp)

Offensichtlich ist diese Abfrage bedingt und teuer. Eine bequemere Möglichkeit besteht darin, die Spalte myindex zur Tabelle hinzuzufügen:

ALTER TABLE simple ADD COLUMN (myindex INT) AFTER timestamp;

und füllen Sie die neue Spalte mit der chronologischen Reihenfolge des Zeitstempels (z. B. über einen PHP-Code)

Neue Abfragen werden einfacher und günstiger:

SELECT 
    c.timestamp AS currenttimestamp,
    COALESCE(b.timestamp,'0000-00-00 00:00:00') AS timestampbefore,
    c.val - COALESCE(b.val,0) AS difference
FROM simple c
LEFT JOIN simple b ON c.myindex = b.myindex+1

Die neue Spalte myindex ähnelt in gewisser Weise dem Datenbanktabellenindex ind_ts. (Warum) Gibt es kein MySql-Konstrukt, um ind_ts anstelle von myindex zu verwenden?

P粉350036783P粉350036783421 Tage vor593

Antworte allen(1)Ich werde antworten

  • P粉217629009

    P粉2176290092023-09-16 12:23:26

    如果您使用 MySQL 8.0 或 MariaDB 10.2(或更高版本),LEAD()LAG() 提供了一种简单的方法来查看之前或之后的行。

    如果您使用的是旧版本,请执行“自加入”。也就是说,将表 JOIN 与其自身连接。然后将两个“桌子”对齐,偏移一。这可能需要生成一个带有新的AUTO_INCRMENT的临时表,以提供一种简单的方法来进行偏移。这可能比您关于“myindex”的想法稍好一些。

    CREATE TABLE new_table (
        myindex INT UNSIGNED AUTO_INCREMENT,
        PRIMARY KEY(myindex))
      SELECT * FROM simple;

    然后

    SELECT a.ts - b.ts AS diff   -- (or whatever the math is)
        FROM new_table AS a
        JOIN new_table AS b  ON a.myindex = b.myindex - 1

    (这不会处理表格的第一行和最后一行。)

    注意:您不能使用TEMPORARY TABLE,因为它不能JOINed到其自身。

    Antwort
    0
  • StornierenAntwort