MySQL に 2 つのテーブルがあり、table1 には 1,013,347 のエンティティと 38 の属性があり、table2 には 7,343,905 のエンティティと 10 の属性があります。次のクエリ (ページネーションの行数を取得することになっています) では、table1.ID は PK、table2.ID はその FK (両方ともインデックス付き) であり、HAVING 句は特定のパーセンテージを超える場合に値を取得します。 、この場合は 50%
SELECT SQL_CALC_FOUND_ROWS *
FROM table1 INNER JOIN table2 ON table1.ID = table2.ID
WHERE table1.attribute1 LIKE 'D%'
GROUP BY table2.ID
HAVING (COUNT(table2.ID) * (100/18)) >= '50'
ここに投稿した簡略化された状態でも、このクエリはコマンド ラインから実行するのに 5 分以上かかります。クエリ、PHP コード (値 '50' と 'D' は PHP 変数を介して割り当てられます)、および/または処理を高速化するために MySQL 構成 (私はデフォルト設定の最新の XAMPP)。どんな助けでも大歓迎です。
EDIT1: VARCHAR(9) である ID 属性を除いて、すべての属性は TINYTEXT です。
EDIT2: EXPLAIN SELECT... 戻り値:
+----+-------------+--------+------+---------------+-------------+---------+------+---------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+-------------+---------+------+---------+---------------------------------+
| 1 | SIMPLE | table2 | ALL | NULL | NULL | NULL | NULL | 7343905 | Using temporary; Using filesort |
| 1 | SIMPLE | table1 | ref | ID | ID | 29 | func | 1 | Using where |
+----+-------------+--------+------+---------------+-------------+---------+------+---------+---------------------------------+
2 rows in set (0.00 sec)