Hi!

MySQL's optimizer has a slight problem. OR queries cause it to get very
confused.

Try the following to get the best performance:

Rewrite SELECT FROM table WHERE (condition1) OR (condition2);

As:

(SELECT FROM table WHERE condition1) UNION (SELECT FROM table WHERE
condition2);

Hope this helps!

Regards,

Chris

On Tue, 2004-02-17 at 00:05, Andreas Pardeike wrote:
> Hi List,
> 
> Can someone explain the results below? It seems that MySQL has a hard
> time choosing keys for 'or' searches. The example here is very simple
> but reflects the more complex cases where lots of rows or joins are
> used perfectly:
> 
> 1) That's the table I have:
> 
> artikelnummer varchar(13) not null
> wordid        int(11)     not null
> typ           enum('interntitel', ...<15 others cut off>... ,'forlag')
> 
> with keys on:
> 
> wordid        (Collation=A, Cardinality= 52447, Index_type=BTREE)
> typ           (Collation=A, Cardinality= 5, Index_type=BTREE)
> artikelnummer (Collation=A, Cardinality= 59003, Index_type=BTREE)
> 
> 
> 2) It's optimized and analysed and I even tried rebuilding it from
>     scratch by dumping and re-reading it:
> 
> mysql> analyze table wordlist;
> +---------------+---------+----------+-----------------------------+
> | Table         | Op      | Msg_type | Msg_text                    |
> +---------------+---------+----------+-----------------------------+
> | test.wordlist | analyze | status   | Table is already up to date |
> +---------------+---------+----------+-----------------------------+
> 
> 
> 3) Some simple query to compare to:
> 
> mysql> explain select wordid from wordlist where wordid in 
> (4000,5000,6000);
> id             1
> select_type    SIMPLE
> table          wordlist
> type           range
> possible_keys  wordid
> key            wordid
> key_len        4
> ref            NULL
> rows           3
> Extra          Using where; Using index
> 
> 
> 4) Now add a 'or' on the same field. It's still fine:
> 
> mysql> explain select wordid from wordlist where wordid in 
> (4000,5000,6000) or wordid in (2000,4500,8000);
> id             1
> select_type    SIMPLE
> table          wordlist
> type           range
> possible_keys  wordid
> key            wordid
> key_len        4
> ref            NULL
> rows           6
> Extra          Using where; Using index
> 
> 
> 5) Same thing on two different fields. Say good-bye to indexed 
> searching:
> 
> mysql> explain select wordid from wordlist where wordid in 
> (4000,5000,6000) or artikelnummer = '834534857345';
> id             1
> select_type    SIMPLE
> table          wordlist
> type           ALL
> possible_keys  wordid,artikelnummer
> key            NULL
> key_len        NULL
> ref            NULL
> rows           472026
> Extra          Using where
> 
> 
> 6) Now for fun an 'and' on the same conditions:
> 
> mysql> explain select wordid from wordlist where wordid in 
> (4000,5000,6000) and artikelnummer = '834534857345';
> id             1
> select_type    SIMPLE
> table          wordlist
> type           ref
> possible_keys  wordid,artikelnummer
> key            artikelnummer
> key_len        13
> ref            const
> rows           1
> Extra          Using where
> 
> 
> What's the point of indices if I cannot combine two indexed fields with 
> OR ?
> 
> Any help appreciated,
> Andreas Pardeike
> 


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to