优化 MySQL 中的 UNION 查询

Fra*_*ois 6 mysql optimization union

我在 MySQL 中的 UNION 查询有问题。我们的网站上有 1000 万玩家,我们希望选择具有多标准系统的玩家。例如,选择美国人,男性,年龄超过 35 岁。

我们正在使用“垂直分区”:每个标准 1 个表。例如:

* user_country
- id_user
- id_country
Run Code Online (Sandbox Code Playgroud)

我们想做这样的查询:

SELECT id_inscri FROM userdata_langue
WHERE id_langue='43'
  UNION
SELECT id_inscri FROM userdata_sexe
WHERE sexe='2'
  UNION
SELECT id_inscri FROM userdata_nb_jour
WHERE nb_jour>='31'
  UNION
SELECT id_inscri FROM userdata_last
WHERE last<='2013-04-07'
  AND last>='2013-04-03' ;
Run Code Online (Sandbox Code Playgroud)

我该如何优化?

- - - 更多细节

解释查询的输出:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY userdata_langue ref id_langue   id_langue   1   const       398846  Using index
2   UNION   userdata_sexe   ref sexe    sexe    1   const   1667137 Using index
3   UNION   userdata_nb_jour    range   nb_jour nb_jour 2   NULL    5830    Using where; Using index
4   UNION   userdata_last   range   last    last    3   NULL    371614  Using where; Using index
NULL    UNION RESULT    <union1,2,3,4>  ALL NULL    NULL    NULL    NULL    NULL
Run Code Online (Sandbox Code Playgroud)

显示创建表

Table   Create Table
userdata_langue CREATE TABLE `userdata_langue` (
 `id_inscri` bigint(20) NOT NULL,
 `id_langue` tinyint(3) unsigned NOT NULL,
 PRIMARY KEY (`id_inscri`),
 KEY `id_langue` (`id_langue`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)

小智 -2

考虑使用UNION ALL. 它应该比 快得多UNION,但它会为满足多个条件的玩家返回重复的行。

如果您可以处理应用程序代码中的重复项,那么这可能是优化查询的好方法。

  • 你“可以”,尽管你要求服务器做与union unique相同的事情——在临时表中删除一组约170万个未索引的行,所以这不可能更快。 (3认同)