私は助けが必要なこのクエリを持っています。そこでと呼ばれるテーブルがあり、複数の日付を持つことができる長い文字フィールドのDEL
という列があります。特定の日付範囲のフィールドに日付があるたびに1つの行を含む出力テーブルを作成する必要があります。多くのユニオンを使用してMySQLクエリを長時間最適化する方法
select ... where ... DEL like "%my_date%"
という単純な理由だけでは、DEL
の列に複数の日付を含めることができないため、複数の行を出力セットに戻す必要があります。 DEL
の列。
ソリューション私はそれが作品を思い付いたが、このような非常に遅いルックスです:DEL
フィールドに特定の日付文字列を含む任意の行(date_format(now() + interval @x day, '%m/%d/%Y')
)がある場合
create temporary table jobtrack.ship_helpert3 as
select * from
(
(
select
date_format(now() - interval 3 day, '%m/%d/%Y') as `Ship_Date`,
more_columns
from
jobticket.insertjobticket
where
DEL like concat('%',date_format(now() - interval 3 day, '%m/%d/%Y'),'%')
) union (
select
date_format(now() + interval 2 day, '%m/%d/%Y') as `Ship_Date`,
more_columns
from
jobticket.insertjobticket
where
DEL like concat('%',date_format(now() + interval 2 day, '%m/%d/%Y'),'%')
) union (
select
date_format(now() + interval 1 day, '%m/%d/%Y') as `Ship_Date`,
more_columns
from
jobticket.insertjobticket
where
DEL like concat('%',date_format(now() + interval 1 day, '%m/%d/%Y'),'%')
) union ...
) t;
各select
クエリをチェックします。クエリはプログラムによって構築され、非常に長い時間がかかることがあります。多くの日付に対してクエリのチェックを行うことができるようにするためです。
insertjobticket
テーブルには40K個の行が含まれていますが、そのサイズが拡大しているため、上記のクエリは完了には時間がかかりすぎます。私はいつもunion
のすべてが効果的に独自のサブクエリを作成して、各日付ごとに何度も何度もテーブル全体をスキャンする必要があるので、なぜそれほど時間がかかるのか理解しています。私はこの仕事をより効率的にする方法を知りません。
誰でもこのクエリをスピードアップする方法を知っていますか?
助けてくれてありがとう、もっと明確にする必要がある場合はお知らせください。
正直なところ、1つの解決策があります。列を1つの列「DEL」にするのではなく、行ごとに1つの日付を含む新しい表を作成します。アプリケーションを変更できない場合は、トリガーでそれを行い、列を更新するたびに新しいテーブルを更新してください。あなたがやることはパッチワークだけです(基本的に、このクエリを実行するたびにこの新しいテーブルを作成することを意味します)。 – Solarflare
はい。スキーマを正規化します。または、RDBMSを使用しても構いません。 – Strawberry
私はこの提案を完全に理解してくれてありがとう。既存のインフラストラクチャのコンテキストで作業するクライアントの要求に取り組む必要があります。間違いなくそれは理想的ではありません。 –