如何更快地进行数据检索?

时间:2015-07-31 16:09:18

标签: mysql sql database performance

我正在开发一个应用程序,它有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秒。有关改进的任何建议吗?

0 个答案:

没有答案