优化Mysql JOIN查询的速度

问题描述 投票:0回答:2

我有两张名为T1的表,由1.6毫升的行和T2组成,由4.6毫升的行组成,具有一对多的关系。

T1的CREATE STMT是:

CREATE TABLE `T1` (
  `field_1` text,
  `field_2` text,
  `field_3` decimal(10,6) DEFAULT NULL,
  `field_4` decimal(10,6) DEFAULT NULL,
  `field_4` decimal(10,6) DEFAULT NULL,
  `field_5` text,
  `field_6` text,
  `field_7` text,
  `field_8` double DEFAULT NULL,
  `field_9` text,
  `field_10` text,
  `field_11` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

T2的CREATE STMT是:

CREATE TABLE `T2` (
  `field_1` int(11) DEFAULT NULL,
  `field_2` text,
  `field_3` text,
  `field_4` text,
  `field_5` text,
  `field_6` text,
  `field_7` text,
  `field_8` text,
  `field_9` text,
  `field_10` text,
  `field_11` text,
  `field_12` text,
  `field_13` text
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我现在没有设置任何类型的索引或任何特定的约束,但T1.field_1应该是我的理想键,可以与T2.field_2字段连接。

如果我决定加入如下:

SELECT * FROM T1
JOIN T2
ON T1.field_1=T2.field_2
WHERE T1.=2130100;

基准非常高。这是EXPLAIN:explain

所以我只是想了解一些可能的改进:

  • 添加一些索引
  • 更改输入字段的类型?
  • 也许添加一个主键?
mysql database join indexing query-performance
2个回答
2
投票

在您错过列名称的情况下,我假设列名为your_col

从mysql 5.0.3开始,varchar可以达到65,535,因此你可以尝试使用varchar而不是text

对于索引,索引的大小有限制,最大密钥长度为767字节(假设每个utf8字符为3个字节。所以大约250个utf8字符)

如果可能的话,索引的候选列必须遵守这些限制,然后您可以添加索引

table t2 colums fiedl_2

并且

table t1 a composite index on  column (Your_col, field_1) 

这些是涉及where和ON子句的列

  SELECT * FROM T1
  JOIN T2
  ON T1.field_1=T2.field_2
  WHERE T1.Your_col=2130100;

0
投票

由于您使用的是latin1,请将t1.field_1t2.field_2切换到不超过767的VARCHAR。使用不可能超过的最短值。同样对所有其他TEXT列。 (如果你需要> 767,坚持使用TEXT。)

然后添加两个索引:

T1:  INDEX(??) -- whatever column you are using in the `WHERE`
T2:  INDEX(field_2)

如果T1中的列是INT,那么2130100就可以了。但如果它是TEXT(或很快将是VARCHAR(..),那么引用它:"2130100"。应该防止T1的令人惊讶和不必要的表扫描。

© www.soinside.com 2019 - 2024. All rights reserved.