Mysql 考虑到匹配大小(293x1行),此查询效率特别低。@bishop这是在本地环境中,而不是在生产环境中。在生产中,表2要大得多。您能在生产数据上显示一个EXPLAIN吗?table2上有一系列恒定条件,因此您可以通过加入一个具有预筛选候选项的物化查询来获得更

Mysql 考虑到匹配大小(293x1行),此查询效率特别低。@bishop这是在本地环境中,而不是在生产环境中。在生产中,表2要大得多。您能在生产数据上显示一个EXPLAIN吗?table2上有一系列恒定条件,因此您可以通过加入一个具有预筛选候选项的物化查询来获得更,mysql,indexing,composite-index,or-condition,Mysql,Indexing,Composite Index,Or Condition,考虑到匹配大小(293x1行),此查询效率特别低。@bishop这是在本地环境中,而不是在生产环境中。在生产中,表2要大得多。您能在生产数据上显示一个EXPLAIN吗?table2上有一系列恒定条件,因此您可以通过加入一个具有预筛选候选项的物化查询来获得更好的结果。不过,老实说,考虑到匹配大小(293x1行),我不明白为什么这个查询效率特别低。@bishop这是在本地环境中,而不是在生产环境中。在生产中,表2要大得多。请在生产数据上显示说明? select count(test.id) from


考虑到匹配大小(293x1行),此查询效率特别低。@bishop这是在本地环境中,而不是在生产环境中。在生产中,表2要大得多。您能在生产数据上显示一个
EXPLAIN
吗?
table2
上有一系列恒定条件,因此您可以通过加入一个具有预筛选候选项的物化查询来获得更好的结果。不过,老实说,考虑到匹配大小(293x1行),我不明白为什么这个查询效率特别低。@bishop这是在本地环境中,而不是在生产环境中。在生产中,表2要大得多。请在生产数据上显示
说明
select count(test.id) from table1 
   inner join table2 on table1.id = table2.id
   where    (table2.email = 'test@gmail.com' 
   OR (table2.phone1 IS NOT NULL AND table2.phone1 in ('123456')) 
   OR (table2.phone2 IS NOT NULL AND table2.phone2 in ('1234456'))) 
   AND table2.id <> 1234 
   AND table2.created_at >= '2015-10-10' 
   AND table2.status NOT IN ('test') 
   AND table2.is_test = 'No';
id  select_type table   type    possible_keys key     key_len ref rows Extra
 1  SIMPLE     table2   range   PRIMARY,     created_at  8        293  Using where
                                created_at,
                                email,
                                phone1,
                                phone2, 
                                com_index       
  1   SIMPLE    table1  eq_ref  PRIMARY       PRIMARY    4    id   1  Using index
+----+-------------+-------+--------+----------------------------------------------+---------+---------+----------------------+--------+-------------+
| id | select_type | table | type   | possible_keys                                | key     | key_len | ref                  | rows   | Extra       |
+----+-------------+-------+--------+----------------------------------------------+---------+---------+----------------------+--------+-------------+
|  1 | SIMPLE      | l0_   | range  | PRIMARY,created_at,email,day_phone,eve_phone | PRIMARY | 4       | NULL                 | 942156 | Using where |
|  1 | SIMPLE      | m1_   | eq_ref | PRIMARY                                      | PRIMARY | 4       | lead_platform.l0_.id |      1 | Using index |
+----+-------------+-------+--------+----------------------------------------------+---------+---------+----------------------+--------+-------------+
SELECT COUNT(DISTINCT(t.id)) FROM (
    SELECT test.id FROM table1 
       INNER JOIN table2 on table1.id = table2.id
       WHERE table2.email = 'test@gmail.com' 
       AND table2.id <> 1234 
       AND table2.created_at >= '2015-10-10' 
       AND table2.status NOT IN ('test') 
       AND table2.is_test = 'No'

    UNION ALL 

    SELECT test.id FROM table1 
       INNER JOIN table2 on table1.id = table2.id
       WHERE table2.phone1 IS NOT NULL AND table2.phone1 in ('123456')
       AND table2.id <> 1234 
       AND table2.created_at >= '2015-10-10' 
       AND table2.status NOT IN ('test') 
       AND table2.is_test = 'No'

    UNION ALL   

    SELECT test.id FROM table1 
       INNER JOIN table2 on table1.id = table2.id
       WHERE table2.phone2 IS NOT NULL AND table2.phone2 in ('1234456')
       AND table2.id <> 1234 
       AND table2.created_at >= '2015-10-10' 
       AND table2.status NOT IN ('test') 
       AND table2.is_test = 'No') AS t