I have a problem with a UNION query in MySQL. We have 10 millions players on our website and we would like to select players with a multi-criterias system. For exemple, selecting US people, men, more than 35 years of age.
We are using "vertical partionning": 1 table per criter. For example:
* user_country
- id_user
- id_country
We would like to do this kind of query:
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' ;
How do I optimize that?
----- More details
Explain output of the query:
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
SHOW CREATE TABLE
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
UNION
toUNION ALL
be an option? Are there duplicates that have to be removed?UNION ALL
query take to run?id_langue='43'
) or are men (sexe='2'
) or havenb_jour>='31'
or have last (updated/changed profile) between 3 and 7 of April 2013 (last<='2013-04-07' AND last>='2013-04-03'
). Are you sure you want or and not and there? Either men or US or ... does not make much sense.