优化Mysql JOIN查询的速度

时间:2019-04-09 08:56:33

标签: mysql database join indexing query-performance

我有两个表,它们分别由具有160万行的T1和具有T2的460万行构成,具有一对多关系。

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字段一起使用

如果我决定加入JOIN,例如:

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

基准非常高。 这是说明: explain

所以我只是想了解什么是可能的改进:

  • 添加一些索引
  • 要更改输入字段的类型吗?
  • 也许添加主键?

2 个答案:

答案 0 :(得分:2)

在您错失列名的情况下,我假定列名为your_col

从mysql 5.0.3形式开始varchar可以达到65,535,因此您可以在可能时尝试使用varchar而不是文本

对于索引,索引最大键长为767字节(假设每个utf8字符3个字节,因此大约250 utf8 char)的大小受到限制

用于索引的列候选对象必须遵守这些限制 如果这是可能的,那么你可以 在

上添加索引

表t2列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;

答案 1 :(得分:0)

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

然后添加两个索引:

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

如果T1中的列为INT,则2130100是确定的。但是,如果它是TEXT(或即将成为VARCHAR(..),请引用它:"2130100"。这样应该可以防止对T1进行意外且不必要的表扫描。