Tell me more ×
Database Administrators Stack Exchange is a question and answer site for database professionals who wish to improve their database skills and learn from others in the community. It's 100% free, no registration required.

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, > 35 yo.

We are using "vertical partionning" : 1 table per criter. For exemple :

* 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' ;

Do you have any idea on how to optimize that ?

Thanks !

François

----- More details Explain 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   
share|improve this question
1  
Would converting those UNION to UNION ALL be an option? Are there duplicates that have to be removed? – ypercube Apr 23 at 20:10
Do each one of the 4 selects run fast? Are there (and what) indexes in the tables? – ypercube Apr 23 at 20:13
Each table has 2 index : - a PRIMARY key on the first column (id_inscri) - an INDEX on the second column 1 and 2 are running fast but return a lot of lines. 3 and 4 are a little more slow but return less lines. – François Apr 23 at 20:17
MyISAM or InnODB tables? Please add the SHOW CREATE TABLE outputs and the EXPLAIN plan of the query. – ypercube Apr 23 at 20:18
@ypercube : I've edited my post with more details – François Apr 23 at 20:23
show 1 more comment

1 Answer

Have you considered using UNION ALL. It should be significantly faster than UNION but will return duplicate rows for players that answers to multiple criteria.

If you can deal with duplicates in your application code, it can be a good way to optimize your query.

share|improve this answer
Unfortunately we really want unique ID :) – François Apr 23 at 20:13
Even so, You can take your data using 'union all' keyword and make a filter by 'group by id_inscri' in the final resultset – Praveen Apr 25 at 11:38
2  
You "could," though you're asking the server to do essentially the same thing as union distinct -- de-duplicating a set of ~1.7 million unindexed rows in a temporary table, so that isn't likely to be any faster. – Michael - sqlbot Apr 26 at 0:42

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.