sql >> データベース >  >> RDS >> Mysql

複数の列テーブルへの複数のMYSQLクエリ

    わかりました。クエリオプティマイザには、大きなテーブルに関する以前の回答に問題があるようです。代わりにこのソリューションを試してください。依存するサブクエリで機能します:

    SELECT DATE_FORMAT(timeTable.minuteTime, '%Y-%m-%d %k:%i') time,
    T2.temp temp,
    S2.solids solids,
    P2.Ph Ph
    FROM
    (
        SELECT minuteTime.minuteTime minuteTime,
        ( SELECT MAX(time) FROM temperature WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 HOUR) tempTime, 
        ( SELECT MAX(time) FROM ph WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 HOUR) phTime,  
        ( SELECT MAX(time) FROM solids WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 HOUR) solidsTime
        FROM  
        (
            SELECT time + INTERVAL 59 - SECOND( time ) SECOND minuteTime
            FROM Ph
            WHERE time >= NOW() - INTERVAL 1 HOUR AND time <= NOW()
            UNION SELECT time + INTERVAL 59 - SECOND( time ) SECOND
            FROM solids
            WHERE time >= NOW() - INTERVAL 1 HOUR AND time <= NOW()
            UNION SELECT time + INTERVAL 59 - SECOND( time ) SECOND
            FROM temperature
            WHERE time >= NOW() - INTERVAL 1 HOUR AND time <= NOW()
            GROUP BY 1
        ) minuteTime
    ) timeTable
    LEFT JOIN temperature T2 ON T2.time = timeTable.tempTime
    LEFT JOIN solids S2 ON S2.time = timeTable.solidsTime
    LEFT JOIN ph P2 ON P2.time = timeTable.phTime
    ORDER BY minuteTime ASC
    

    それぞれ約800,000行のテストデータを使用して3つのテーブルを設定しました。 MySQL 5.5.30では、上記のクエリは約3.5秒で実行され、61行の結果を返します。ただし、絶対に各時間列にインデックスを付ける必要があります:

    ALTER TABLE `ph` ADD INDEX ( `time` ) ;
    ALTER TABLE `solids` ADD INDEX ( `time` ) ;
    ALTER TABLE `temperature` ADD INDEX ( `time` ) ;
    

    それ以外の場合、クエリは終了しません。この量のデータを処理するクエリはないと思います。



    1. MySQL-まだ存在しない場合は挿入

    2. データベースの構造/設計

    3. MySQLダンプをPostgreSQLデータベースにインポートします

    4. 異なるクラスにRelation::morphMap()を使用する方法