"Jigal van Hemert" <[EMAIL PROTECTED]> writes:

> From: "Scott Gifford"

[...]

>> Right, ALL would be a great plan if it weren't for the LIMIT 1.
>
> The LIMIT 1 will be performed *after* the recordset is sorted :-(

Ah, I think that is the piece I was missing.

[...]

>> I'm a little surprised MySQL can't figure out on its own that it can
>> get the same effect by using mls_num from either table, since the
>> tables are joined on it, so the values will always be identical.
>
> You have two LEFT JOINs, so the values of mls_num might be something (the
> identical value you refer to) or NULL. So, you expect MySQL to evaluate the
> JOIN conditions, figure out that the ORDER BY column actually is the same as
> columns from other tables and see if one of these columns is actually the
> first non-const table in the execution path?

Of course with the LEFT JOINs it can be difficult to figure out
(though in this case the JOINs are on mls_num, so it will never be
NULL), but with two tables were using a "regular" join on the column
in question, it does seem like a straightforward optimization.  Maybe
it's not common enough in practice to justify implementing it (or
maybe I'm missing something).

[...]

>> which is the same as what I get when I force a STRAIGHT_JOIN.
>> So with two plans that will use the same number of records, I'm
>> surprised MySQL doesn't choose the one that will allow it to use an
>> index.
> There is no limiting condition whatsoever in the WHERE clause (except the
> JOIN condition), so it will try to estimate based on the cardinality and the
> number of records in the table which excecution path will require it to
> evaluate the smallest number of records. It will try to estimate whether the
> use of an index is appropriate or not. But I can imagine that it will favour
> a full table scan of a small table that will result in a small recordset,
> especially when it knows that the other, bigger tables are JOINed with only
> 1 or a few records per join.

In this case, the two tables have identical cardinality, so it
shouldn't be favoring one over the other.

[...]

> This is part of a routine that generates many different queries based on a
> wide variety of search forms, predefined selections, etc. Most of the time
> MySQL does a great job with finding the 'right' execution path, but
> sometimes it goes horribly wrong.

That's been my experience too; we've been running this application for
about 5 years, and this is only the second time something like this
has come up.

[...]

>> I tried that using mirealsource_homes.mls_num in the WHERE clause and
>> it didn't make a difference.
>
> I tried to say that you could/should try to limit the number of records that
> are selected in the first place. 
[...]
> So, can you think of a limitation that would preselect a part of the
> mirealsource_homes.mls_num table?

Unfortunately, not in the general case.

>> Are there any other global things I can try, to tell MySQL to avoid
>> table scans?  The queries almost always use at most LIMIT 10, so a
>> table scan is generally not the right idea
>
> A full table scan is the right idea as long as you select more than 30% of
> the table, sort it and after that apply the limit 10 (which is the only
> solution for such a query).

Right, but our queries always use a LIMIT 10 or LIMIT 1, so a full
table scan is never a good deal if an index is available.  I was
hoping for some way to communicate that to MySQL.

I think I'm going to take a look at the MySQL source and see if
there's anything I can tweak to get the effect I want.  I'll report
back my results.

Thanks for all your help!

----ScottG.

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

Reply via email to