Как использовать индекс в JOIN с OR в MYSQL [дубликат]

Наконец я придумал удобную функцию полезности с унифицированным интерфейсом для итерации объектов, строк, массивов, типизированных массивов, карт, наборов (любые итерации).

const iterate = require('@a-z/iterate-it');
const obj = { a: 1, b: 2, c: 3 };

iterate(obj, (value, key) => console.log(key, value)); 
// a 1
// b 2
// c 3

https: //github.com/alrik/iterate-javascript

9
задан Bob Davies 20 June 2012 в 23:47
поделиться

2 ответа

В вашем запросе теоретически возможно, что у одного ребенка есть два разных родителя, что сделало бы его для нестандартной терминологии. Предположим, что ваши шаблоны данных делают это невозможным.

Затем следующее дает вам тот же результат, используя отдельные индексы, по одному индексу на столбец.

SELECT parent.field, child.field
FROM parent
JOIN child ON child.id = parent.id 

UNION ALL

SELECT parent.field, child.field
FROM parent
JOIN child ON child.id = parent.otherid
7
ответ дан Jirka Hanika 4 September 2018 в 09:58
поделиться
EXPLAIN 
SELECT parent.fld, child.fld 
  FROM parent JOIN child ON child.id = parent.id  
 UNION ALL 
SELECT parent.fld, child.fld
  FROM parent JOIN child ON child.id = parent.otherid
   AND parent.otherid <> parent.id

с таблицами с использованием механизма MyISAM:

id  select_type   TABLE       TYPE    possible_keys  KEY      key_len  ref                  ROWS  Extra
1   PRIMARY       parent      ALL     PRIMARY                                               9999
1   PRIMARY       child       eq_ref  PRIMARY        PRIMARY  4        test.parent.id       1
2   UNION         parent      ALL     parent_ix1                                            9999  USING WHERE
2   UNION         child       eq_ref  PRIMARY        PRIMARY  4        test.parent.otherid  1
    UNION RESULT  <union1,2>  ALL

с таблицами с использованием механизма InnoDB:

id  select_type   table       type    possible_keys  key         key_len  ref            rows  Extra
1   PRIMARY       child       ALL     PRIMARY                                            9903
1   PRIMARY       parent      eq_ref  PRIMARY        PRIMARY     4        test.child.id  1
2   UNION         child       ALL     PRIMARY                                            9903
2   UNION         parent      ref     parent_ix1     parent_ix1  5        test.child.id  1     Using where
    UNION RESULT  <union1,2>  ALL   
0
ответ дан spencer7593 4 September 2018 в 09:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: