2

ここでは、次のようにそこにある tracking_no の次のテーブルに結合したいと思います

SELECT *
FROM tracker_mngr AS pkgdsp 
LEFT JOIN tracker AS taq ON taq.tracking_no LIKE CONCAT('%', pkgdsp.tracking_no ,'%')

ただし、クエリの実行には時間がかかります。以下はテーブル構造です

テーブル構造:

CREATE TABLE `tracker_mngr` (
`id_package_dispatching` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`tracking_no` VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (`id_package_dispatching`),
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `tracker` (
`tracking_no` VARCHAR(50) NOT NULL DEFAULT '',
`status` VARCHAR(100) NOT NULL DEFAULT '',
`status_input_date` VARCHAR(15) NOT NULL DEFAULT '',
`status_input_time` VARCHAR(4) NOT NULL DEFAULT '',
PRIMARY KEY (`tracking_no`,`status`,`status_input_date`,`status_input_time`),
UNIQUE KEY `idx_tracking_no_status_01` (`tracking_no`,`status`,`status_input_date`,`status_input_time`),
KEY `idx_tracking_no_01` (`tracking_no`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

しかし、私は tracker_mngr テーブルにインデックスを作成する権限を持っていません。

tracking_no A113035604231A A113035604220A-1 113036092514 113036092433-1

トラッカーには tracking_no が含まれます

tracking_no 113035604231 for (A113035604231A) 113035604220 for (A113035604220A-1) 113036092514 for (113036092514) 113036092433 for (113036092433-1)

これが私のクエリのExplainコマンドテーブルです

+----+-------------+--------+------+---------------+------+---------+------+--------+-------+
| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows   | Extra |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------+
|  1 | SIMPLE      | pkgdsp | ALL  | NULL          | NULL | NULL    | NULL | 127362 |       |
|  1 | SIMPLE      | taq    | ALL  | NULL          | NULL | NULL    | NULL |  79766 |       |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------+

しかし、実行に時間がかかり、インデックスを作成しましたが、上記の表に示すように、検索にインデックスを使用していません。どうすればこのクエリのパフォーマンスを向上させることができますか?

4

2 に答える 2

0

あなたのデータがどのように一致するかを理解するのに苦労しています。上記のコメントの SQL は、元の投稿のそれと実際には一致しません。

ただし、SQL が示唆するとおりであり、tracker の tracking_no フィールドに単一の追跡番号が含まれており、tracking_no に格納されている複数の追跡番号の 1 つが一致する tracker_mngr から任意のレコードを戻したい場合は、次のようなことを試してください (そうではありません)。テスト済み):-

SELECT * 
FROM tracker_mngr AS pkgdsp 
LEFT JOIN tracker AS taq 
ON FIND_IN_SET(taq.tracking_no, REPLACE(REPLACE(pkgdsp.tracking_no, ' for (', ',')), ') ', ',') > 0

ただし、これにより 2 行が返されることがあります (113036092514 が 2 回表示され、1 回は括弧内に、もう 1 回は括弧外に表示されます)。

代替手段はありますが、さらにプレイする前に、データがどのように一致するかを正確に確認したいと思います.

于 2013-04-29T13:24:22.210 に答える