Hello Monty, Thank you for your feedback on the four diffs and for approving them. This makes getting TokuDB to work with MariaDB much simpler.
I could not tell from the original email, but is the change Sergei made in http://lists.askmonty.org/pipermail/commits/2010-October/000626.html going to be committed as well? Thanks -Zardosht On Wed, May 18, 2011 at 12:25 PM, Michael Widenius <mo...@askmonty.org> wrote: > > Hi! > > Here comes the feedback, patch by patch. > > Those that are ok 'as such or with small modifications' I will add to > the 5.3 tree at once. > >>>>>> "Zardosht" == Zardosht Kasheff <zardo...@gmail.com> writes: > > Zardosht> Hello all, > Zardosht> First off, thanks for hosting the storage engine summit last Friday. > > Zardosht> At the beginning of the day, I was encouraged to send the patches > that > Zardosht> I had for MWL#113 to the MariaDB developers list, in hopes possibly > Zardosht> getting them into MariaDB 5.3. Here they are. They are patched off > of > Zardosht> MariaDB 5.2.3. > > Zardosht> They are all relatively simple. Here is what the patches do. > Zardosht> - 1.diff - add an index flag HA_CLUSTERED_INDEX. If a storage > engine > Zardosht> exposes this flag for an index, then that index is clustered. This > was > Zardosht> proposed in http://bugs.mysql.com/bug.php?id=51687 > > > 1.diff > >> Index: sql/handler.h >> =================================================================== >> --- sql/handler.h (revision 25779) >> +++ sql/handler.h (revision 25780) >> @@ -151,6 +151,10 @@ >> #define HA_READ_RANGE 8 /* can find all records in a range >> */ >> #define HA_ONLY_WHOLE_INDEX 16 /* Can't use part key searches */ >> #define HA_KEYREAD_ONLY 64 /* Support HA_EXTRA_KEYREAD */ >> +// no IO if read data when scan index >> +// i.e index is covering >> +// skipping 128 because SOME product has HA_KEY_SCAN_NOT_ROR >> +#define HA_CLUSTERED_INDEX 256 > > /* > bits in alter_table_flags: > > I changed the above to use 512, as this is the next free flag. I also > added this comment: > > /* > Data is clustered on this key. This means that when you read the key > you also get the row data in the same block. > */ > > ------------- > I also added new comments in the code for how clustered data was used. > I also removed some calls to table->file->primary_key_is_clustered(). > > The definition for primary_key_is_clustered() is after this as > follows: > > /* > Check if the primary key (if there is one) is a clustered key covering > all fields. This means: > > - Data is stored together with the primary key (no secondary lookup > needed to find the row data). The optimizer uses this to find out > the cost of fetching data. > - The primary key is part of each secondary key and is used > to find the row data in the primary index when reading trough > secondary indexes. > - When doing a HA_KEYREAD_ONLY we get also all the primary key parts > into the row. This is critical property used by index_merge. > > For a clustered primary key, index_flags() returns also HA_CLUSTERED_INDEX > > @retval TRUE yes > @retval FALSE No. > */ > > I also fixed the part in the code where it was possible to use the new > HA_CLUSTERED_INDEX flag and changed get_best_ror_intersect() to prefer > non clustered indexes before clustered index. > > Code is now commited to my 5.3 tree; Will be pushed shortly. > > ----------- > > Zardosht> - 2.diff - simple fix to get select ... order by DESC working > > My changes for 1.diff fixed this. > > The code is now: > > Here is your change: > >> + bool is_covering= table->covering_keys.is_set(nr) || >> + (nr == table->s->primary_key && >> + table->file->primary_key_is_clustered()) || >> + test(table->file->index_flags(nr, 0, 0) & >> HA_CLUSTERED_INDEX); >> >> - bool is_covering= table->covering_keys.is_set(nr) || >> - (nr == table->s->primary_key && >> - table->file->primary_key_is_clustered()); >> - > > Here is the code after my change: > > bool is_covering= (table->covering_keys.is_set(nr) || > (table->file->index_flags(nr, 0, 1) & > HA_CLUSTERED_INDEX)); > > I was able to remove the test for > table->file->primary_key_is_clustered() as I fixed all innodb code to > set HA_CLUSTERED_INDEX for clustered keys. > > Zardosht> - 3.diff - fix for index merge and clustering keys. This was > inspired > Zardosht> by Sergey Petrunya originally proposing > Zardosht> http://lists.mysql.com/internals/37165. It has been altered a bit > now > Zardosht> that HA_CLUSTERED_INDEX is added. > >> --- sql/opt_range.cc (revision 25783) >> +++ sql/opt_range.cc (revision 25784) >> @@ -4497,8 +4497,20 @@ >> 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 && test(param->table->file->index_flags(keyno,0,0) >> & HA_CLUSTERED_INDEX)) >> + { >> + tree->n_ror_scans--; >> + continue; >> + } >> if (!(scan= make_ror_scan(param, idx, tree->keys[idx]))) >> return NULL; >> if (param->real_keynr[idx] == cpk_no) > > Hm.. I originally changed this code to put the clustered keys last. > The idea was to make it possible to work with engines that supports > multiple clustered keys but still prefer normal keys first. > > Have now changed the code to use your approach instead. > > Zardosht> - 4.diff - extend fix of MySQL bug 50843 for clustering keys > Zardosht> - > http://lists.askmonty.org/pipermail/commits/2010-October/000626.html. > Zardosht> I cannot find this checked in anywhere, but it seems to be a good > Zardosht> patch for clustering keys. This was inspired from > Zardosht> > http://www.mail-archive.com/maria-developers@lists.launchpad.net/msg03491.html. > Zardosht> We currently have a hacky workaround for this issue, but this seems > Zardosht> like the right fix. > > This part also changed in my original patch. > >> + >> + Also not in case where the index is a clustering index >> */ >> if ((select_limit >= table_records) && >> (tab->type == JT_ALL && >> tab->join->tables > tab->join->const_tables + 1) && >> ((unsigned) best_key != table->s->primary_key || >> - !table->file->primary_key_is_clustered())) >> + !table->file->primary_key_is_clustered()) && >> + !(best_key >= 0 && test(table->file->index_flags(best_key,0,0) & >> HA_CLUSTERED_INDEX)) >> + ) >> DBUG_RETURN(0); > > The new code looks like: > > if (best_key < 0 || > ((select_limit >= table_records) && > (tab->type == JT_ALL && > tab->join->tables > tab->join->const_tables + 1) && > !(table->file->index_flags(best_key, 0, 1) & HA_CLUSTERED_INDEX))) > goto use_filesort; > > No reson to test for table->file->primary_key_is_clustered() anymore. > > Zardosht> I also have one more fix for clustering keys and joins (in > Zardosht> make_join_readinfo), but I want to look over it and before sending > it. > > ok. > > Zardosht> Also, if for whatever reason all of the patches are not good enough > Zardosht> for checking in, please consider some subset of the patches. This is > Zardosht> by no means "all or none". That is why I broke it up into separate > Zardosht> diff files. > > No problem; All changes are in. > I will push as soon as I have got an ok from Serg / Spetrunia. > > Regards, > Monty > _______________________________________________ Mailing list: https://launchpad.net/~maria-developers Post to : maria-developers@lists.launchpad.net Unsubscribe : https://launchpad.net/~maria-developers More help : https://help.launchpad.net/ListHelp