我正在开发一个应用程序,它有5个主要表,其中大多数读取来自和4个其他表,其中插入数据。我将提供2个表的详细信息以及此特定数据检索中涉及的特定列。
表1:SystemsTable - 2.2k +行
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| Id | bigint(20) | NO | PRI | | auto_increment |
| Serial1 | varchar(255) | YES | | NULL | |
| Serial2 | varchar(255) | YES | | NULL | |
| ModelNum | varchar(255) | YES | | NULL | |
| ... | .... | .. | 0 | | |
+------------+--------------+------+-----+---------+----------------+
指数 - ID& ModelNum。没有外键
表2:DetailTable - 42k +行
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| Id1 | varchar(20) | NO | PRI | | |
| Id2 | varchar(20) | NO | PRI | | |
| Id3 | varchar(20) | NO | PRI | | |
| Serial | varchar(255) | YES | | NULL | |
| ... | .... | .. | 0 | | |
+------------+--------------+------+-----+---------+----------------+
索引 - ID1,ID2,ID3。没有外键
我已经编写了一个JOIN查询,根据modelNum选择表1中的Serials,并使用OR运算符将DetailTable中的Serials与Serial进行比较。
Select b.* from SystemsTable AS a
INNER JOIN DetailTable AS b
ON (b.Serial LIKE concat('%',a.Serial1,'%') OR
b.Serial LIKE concat('%',a.Serial2,'%'))
WHERE a.modelNum = '1234';
我在MySQL Workbench中运行了这个查询。它需要31-32秒来检索11.1k行。
更新:
Select b.* from SystemsTable AS a
INNER JOIN DetailTable AS b
ON (b.Serial = a.Serial1 OR
b.Serial = a.Serial2)
WHERE a.modelNum = '1234';
当我用' ='取代通配符时,它仍然需要16秒。有关改进的任何建议吗?