List: | Commits | « Previous MessageNext Message » | |

From: | Ole John Aske | Date: | February 28 2011 11:38am |

Subject: | bzr push into mysql-5.1-telco-7.0 branch (ole.john.aske:4234 to 4235) | ||

View as plain text |

4235 Ole John Aske 2011-02-28 Fixed compiler warnings introduced by last push. modified: sql/ha_ndbcluster.cc 4234 Ole John Aske 2011-02-28 Fix for bug#11804277 - INCORRECT INDEX MAY BE SELECTED DUE TO INSUFFICIENT STATISTICS FROM CLUSTER Add heuristics to ha_ndbcluster::records_in_range() which identifies a range as: - An open bound range (<column> LT/GT <bound) - A closed bound range (<column> BETWEEN <low> AND <HIGH>) - A (partial) EQ-range (<column> EQ <bound>) ... Or a combination of these.... These are handled as follows: Open bound ranges ----------------- Without a histogram of how the values in the index are distributed, we can only assume an equal distrubution. A statistically correct estimate for a condition of the form '<column> LT/GT <bound>' would then have been to assume it selects 50% of the rows in the table. However, I have experienced that this will cause the range-cost to directly compete with the cost of a full table scan. We should therefore be somewhat more conservative and estimate 10% of the rows to be returned. Closed bound range ------------------ We assume this to be somewhat better than an open bounded range returning 5% of the rows in the table. EQ-range -------- An EQ-range will excatly specify a fraction of the first part of an index. It is reasonable to assume: - Specifing a larger fraction of the index will improve the selectivity of the EQ-range. - Each part of the specified EQ-range will have the same selectivity. We can model this as a Binomial Distribution of the indexed values. http://en.wikipedia.org/wiki/Binomial_distrib modified: mysql-test/suite/ndb/r/ndb_condition_pushdown.result mysql-test/suite/ndb/r/ndb_index.result mysql-test/suite/ndb/r/ndb_index_unique.result mysql-test/suite/ndb/r/ndb_read_multi_range.result mysql-test/suite/ndb/r/ndb_statistics.result mysql-test/suite/ndb/t/ndb_statistics.test sql/ha_ndbcluster.cc === modified file 'sql/ha_ndbcluster.cc' --- a/sql/ha_ndbcluster.cc 2011-02-28 10:42:04 +0000 +++ b/sql/ha_ndbcluster.cc 2011-02-28 11:38:19 +0000 @@ -11256,7 +11256,7 @@ ha_ndbcluster::records_in_range(uint inx if (eq_fraction >= 1.0) // Exact match -> 1 row DBUG_RETURN(1); - rows = (Uint64)(table_rows / pow(table_rows, eq_fraction)); + rows = (Uint64)((double)table_rows / pow(table_rows, eq_fraction)); if (rows > (table_rows/50)) // EQ-range: Max 2% of rows rows= (table_rows/50); No bundle (reason: useless for push emails).

Thread | ||
---|---|---|

• bzr push into mysql-5.1-telco-7.0 branch (ole.john.aske:4234 to 4235) | Ole John Aske | 28 Feb |