List:Internals« Previous MessageNext Message »
From:Eric Jensen Date:July 4 2009 10:35pm
Subject:Re: proposed design for UNION Order By optimization
View as plain text  
I believe I have located the reason for B below (the selects on the  
temporary table failing to use the index).  JOIN::exec in  
sql_select.cc does the following call:

       if (create_sort_index(thd, curr_join,
			    curr_join->group_list ?
			    curr_join->group_list : curr_join->order,
			    curr_join->select_limit,
			    (select_options & OPTION_FOUND_ROWS ?
			     HA_POS_ERROR : unit->select_limit_cnt),
                             curr_join->group_list ? TRUE : FALSE))

However, the definition for that method is:

/*
...
      is_order_by        true if we are sorting on ORDER BY, false if  
GROUP BY
                         Used to decide if we should use index or not
...
*/
create_sort_index(THD *thd, JOIN *join, ORDER *order,
		  ha_rows filesort_limit, ha_rows select_limit,
                   bool is_order_by)

Is this a bug that it's passing true for is_order_by when there is a  
group_list or what don't I understand?

Secondary problem: test_if_skip_sort_order would not return true in my  
case even if I got past this step, since my table- 
 >keys_in_use_for_order_by is zero, as is table- 
 >keys_in_use_for_query, as is table->s->keys_in_use, as is join- 
 >keyuse, as is tab->keyuse, and tab->ref->key = -1, although table->s- 
 >keys is indeed equal to one so it knows there is one on this table,  
it's just not used for this query.  Is there some function that must  
be called after creating an index on a temporary table to make that  
index available to selects?  It's clearly existing and in use, since  
it's dedup'ing entries for the unique.

I'm having a tough time debugging what is supposed to set all this.   
Is it get_best_combination setting up join->keyuse which is passed to  
make_join_statistics which calls update_ref_and_keys or is there  
somewhere else I need to look to figure out why the key on my temp  
table isn't set here even though it should cover the order by of this  
query?

Thanks,
eric

On Jun 5, 2009, at 7:55 PM, Eric Jensen wrote:

> it is missing the following functionality for it to be efficient:
>
> A.  take the value selected with select_idx and use it as a  
> condition for the next join.  instead, it's just using limit/offset
> B.  it doesn't seem to be using the btree index i create on the  
> temporary table for either the select_idx lookups or the final sort
>
> anyone's help figuring out / adding any of these things would be  
> appreciated.  the patch is attached.

Thread
proposed design for UNION Order By optimizationEric Jensen13 Mar
  • RE: proposed design for UNION Order By optimizationRick James13 Mar
  • Re: proposed design for UNION Order By optimizationEric Jensen6 Jun
    • RE: proposed design for UNION Order By optimizationRick James6 Jun
    • Re: proposed design for UNION Order By optimizationEric Jensen7 Jun
    • Re: proposed design for UNION Order By optimizationEric Jensen5 Jul
      • Re: proposed design for UNION Order By optimizationEric Jensen5 Jul
        • Re: proposed design for UNION Order By optimizationEric Jensen6 Jul
Re: proposed design for UNION Order By optimizationEric Jensen6 Jun
Re: proposed design for UNION Order By optimizationEric Jensen12 Jul