私はMySQLに2つのテーブルを持っていますが、table1には1,013,347のエンティティと38の属性があり、table2には7,343,905のエンティティと10の属性があります。次のクエリ(ページングの行数を取得する予定)では、table1.IDはPK、table2.IDはFK(どちらもインデックス付けされている)、HAVING句は特定のパーセンテージを超える場合に値を取得しますこの場合、50%MySQLクエリが非常に遅い
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: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)
'EXPLAIN SELECT ...'と表示されたらどうなりますか? –
パフォーマンスには影響しませんが、数字を引用することはありません。 '' 50'''、それは結局あなたを上回ります。プラス義務的なコーディングホラー[「ページネーションは死んでいる」参照](http://www.codinghorror.com/blog/2012/03/the-end-of-pagination.html)。 – Ben
table1を索引付けしましたか?attribute1、これに対してあなたは 'LIKE'をしていますか? – Marc