Hello Jonas, Thank you for filing this feature request. Are there plans to add support for clustered indexes in MySQL soon? This is something I have been researching on and off for a while now. Here are my thoughts.
It seems that there are two parts to this feature request: 1) a new flag that allows the storage engine to report that an index is clustered 2) changes to the optimizer to properly support clustered keys. I like #1. The way that I dealt with it was not as good. I added handler::supports_clustered_keys(), and used that function and HA_CLUSTERING from my patch to determine if an index is clustered. Your method is better. As for #2, I do not think it is enough. Here are two other locations of code I know that will need to be modified: 1) find_shortest_key in sql/sql_select.cc. (This will be an addition to MySQL bug #39653) 2) get_best_ror_intersect in sql/opt_range.cc. This is for index_merge. A patch of what I have done is in the attached file 9-index_merge_clustering.txt. This patch was the result of a long thread on the internals alias (which you may want to CC for this discussion). The link to the thread is http://lists.mysql.com/internals/36977. There may be more places that need to be modified. I think the approach to finding out if other places need to be modified is to pattern match off of how the optimizer deals with clustered v. non-clustered primary keys. It does so by having a function handler::primary_key_is_clustered. I think one needs to search the optimizer for all instances of this function, see why it is being called, and see if it applies to clustered v. non-clustered secondary keys as well. -Zardosht On Wed, Mar 3, 2010 at 5:57 AM, Jonas Oreland <jo...@mysql.com> wrote: > Hi, > > I just filed http://bugs.mysql.com/bug.php?id=51687 > which is very related to your bug#45458. > > If you would care to look at it and provide feedback, > I would appreciate it. > > /Jonas >
Index: sql/opt_range.cc =================================================================== --- sql/opt_range.cc (revision 17423) +++ sql/opt_range.cc (revision 17424) @@ -4525,6 +4525,7 @@ TRP_ROR_INTERSECT *get_best_ror_intersect(const PA ROR_SCAN_INFO *cpk_scan= NULL; uint cpk_no; bool cpk_scan_used= FALSE; + bool supports_clustered_keys = param->table->file->supports_clustered_keys(); if (!(tree->ror_scans= (ROR_SCAN_INFO**)alloc_root(param->mem_root, sizeof(ROR_SCAN_INFO*)* @@ -4536,8 +4537,20 @@ TRP_ROR_INTERSECT *get_best_ror_intersect(const PA for (idx= 0, cur_ror_scan= tree->ror_scans; idx < param->keys; idx++) { ROR_SCAN_INFO *scan; + uint keyno= param->real_keynr[idx]; + if (!tree->ror_scans_map.is_set(idx)) + { continue; + } + /* + Ignore clustering keys. + */ + if (keyno != cpk_no && param->table->key_info[keyno].flags & HA_CLUSTERING && supports_clustered_keys) + { + tree->n_ror_scans--; + continue; + } if (!(scan= make_ror_scan(param, idx, tree->keys[idx]))) return NULL; if (param->real_keynr[idx] == cpk_no)
-- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/mysql?unsub=arch...@jab.org