Mysql 与第一个表字段或第二个表字段中的WHERE左连接

Mysql 与第一个表字段或第二个表字段中的WHERE左连接,mysql,sql,database,performance,database-design,Mysql,Sql,Database,Performance,Database Design,我需要解决的问题是: 假设tb1是一个具有字段编号_original的表,我想创建表tb2来存储该字段的新值,我称之为编号_new。我这样做是因为我无法更改number_原始值,我不喜欢在表tb1上创建字段number_new,因为它在95%以上的11mi记录中为空。您需要为tb1.number_original和tb2.number_new建立索引,可能还需要为tb1.id和tb2.id建立索引。然后需要MySQL来利用索引。我不知道会不会 通常,当没有索引回答查询的搜索参数时,DBMS将扫描

我需要解决的问题是:

假设tb1是一个具有字段编号_original的表,我想创建表tb2来存储该字段的新值,我称之为编号_new。我这样做是因为我无法更改number_原始值,我不喜欢在表tb1上创建字段number_new,因为它在95%以上的11mi记录中为空。

您需要为tb1.number_original和tb2.number_new建立索引,可能还需要为tb1.id和tb2.id建立索引。然后需要MySQL来利用索引。我不知道会不会

通常,当没有索引回答查询的搜索参数时,DBMS将扫描表

这是您的查询:

+----+-------------+-------+-------+----------------+----------------+---------+------+----------+----------------------------------------------------+
| id | select_type | table | type  | possible_keys  | key            | key_len | ref  | rows     | Extra                                              |
+----+-------------+-------+-------+----------------+----------------+---------+------+----------+----------------------------------------------------+
|  1 | SIMPLE      | tb1   | index | number_original| number_original| 5       | NULL | 11683843 | Using index                                        |
|  1 | SIMPLE      | tb2   | ALL   | PRIMARY        | NULL           | NULL    | NULL |        2 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+-------+----------------+----------------+---------+------+----------+----------------------------------------------------+

每个子查询应该使用其中一个索引。这确实会产生删除重复项的联合开销,但这可能比全表扫描要好。

我不确定这是否有帮助,但。。。通过使用与select相同的语句删除or,其中COALESCEtb2.number\u new、tb1.number\u original=可能更有效。。。但是如果填充了新的\u编号,它将永远不会搜索原始的\u编号。。。。因此,结果会有所不同…其中使用COALESCE没有区别,全表扫描…:你有矛盾,请解决它。首先从tb2中选择;然后您要创建tb2。是哪一个?如果您正在创建一个表,让我们看看它和INSERT。
+----+-------------+-------+-------+----------------+----------------+---------+------+----------+----------------------------------------------------+
| id | select_type | table | type  | possible_keys  | key            | key_len | ref  | rows     | Extra                                              |
+----+-------------+-------+-------+----------------+----------------+---------+------+----------+----------------------------------------------------+
|  1 | SIMPLE      | tb1   | index | number_original| number_original| 5       | NULL | 11683843 | Using index                                        |
|  1 | SIMPLE      | tb2   | ALL   | PRIMARY        | NULL           | NULL    | NULL |        2 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+-------+----------------+----------------+---------+------+----------+----------------------------------------------------+
SELECT COALESCE(tb2.number_new, tb1.number_original) as number
FROM tb1 LEFT JOIN
     tb2
     ON tb2.id = tb1.id
WHERE  tb1.number_original = <PARAM> OR tb2.number_new = <PARAM>;
SELECT COALESCE(tb2.number_new, tb1.number_original) as number
FROM tb1 LEFT JOIN
     tb2 
     ON tb2.id = tb1.id
WHERE tb1.number_original = <PARAM>
UNION
SELECT COALESCE(tb2.number_new, tb1.number_original) as number
FROM tb1 LEFT JOIN
     tb2 
     ON tb2.id = tb1.id
WHERE tb2.number_new = <PARAM>;