概要
二つのテーブルの検索結果を UNION ALL で結合後に、
ORDER BYして LIMIT OFFSETでページネーションを実装したいです。
が、ORDER BYが遅いのでなんとかして早いクエリを作りたいです。
また、実行計画を確認したところインデックスは使われています。
クエリは以下の通りです、
1ページ目
SQL
1(SELECT column1 AS A, column2 AS B FROM table1 WHERE colmun1 = 100) 2UNION ALL 3(SELECT column3 AS A, column4 AS B FROM table2 WHERE colmun3 = 101) 4ORDER BY B DESC 5LIMIT 1, 20;
2ページ目
SQL
1(SELECT column1 AS A, column2 AS B FROM table1 WHERE colmun1 = 100) 2UNION ALL 3(SELECT column3 AS A, column4 AS B FROM table2 WHERE colmun3 = 101) 4ORDER BY B DESC 5LIMIT 21, 20;
table1がかなりレコード数の多いテーブルなので、UNION ALL してしまうとORDER BYが遅いです。
上記クエリと同じ結果が得られるクSQLで早くする方法はないでしょうか。
実行計画
+----+--------------+---------------+------------+-------+--------------------+---------+---------+------+---------+----------+------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+--------------+---------------+------------+-------+--------------------+---------+---------+------+---------+----------+------------------------------------+ | 1 | PRIMARY | table1 | NULL | ref | column1,column2 | column1 | 4 | NULL | 3654200 | 95.52 | Using where | | 2 | UNION | table2 | NULL | range | column3,column4 | column3 | 4 | NULL | 6985 | 50.00 | Using index condition; Using where | | NULL | UNION RESULT | <union1,2> | NULL | ALL | NULL | NULL | NULL | NULL | NULL | NULL | Using temporary; Using filesort | +----+--------------+---------------+------------+-------+--------------------+---------+---------+------+---------+----------+------------------------------------+