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