Hi, Hello everyone ！ I'm daydreaming .
The topic I want to share with you today is ：“ What is the cardinal number ？”
It is recommended to read the original link
I welcome your attention , Just started writing , Ongoing update ～
Can add my wechat 17861405320, Welcome to join the big guys
One 、 What's the base number ？
Cardinality Refers to MySQL The number of different values for a column in a table .
If this class is the only index , The cardinal number = Row number .
If this column is sex, Enumeration types are only male and female , Then it's the cardinal number 2
Cardinality The higher the , The more valuable columns become indexes .MySQL The implementation plan will also be based on Cardinality Choose the index .
You can see the cardinality of the columns in the table in the following way .
For example, this classic example ：
There is a column for sex, The for sex The value stored in the column Either male or female , Its largest base is 2.
Then there is no need for sex Index . because , In order to improve you based on sex Query speed of ,MySQL A new index will be created for the new index you selected B+Tree. But you sex There are only two values , about MySQL Come on , Even if it creates B+Tree Indexes , When the query is actually executed , At most one binary query , The rest of the operation can only be traversal , So for sex It doesn't make much sense to create an index .
Two 、InnoDB When to update the base ？
innodb_stats_auto_recalc control MySQL Whether to actively recalculate the persistent information . The default is 1 Express true,0 Express false.
By default, when rows in a table change more than 10% when , Recalculate the cardinality information .
3、 ... and 、 The base number is estimated
The cardinality is not updated in real time ！ And it's an estimated value from sampling ！
As for the formula of cardinal number , It may not matter .
It's important that you know , It's an estimate by randomly sampling data pages .
And the number of pages randomly sampled can be determined by the parameter
innodb_stats_persistent_sample_pages Set up , The default value is 20.
That means The base value is not accurate , Even if the results of each calculation are still quite large .
Four 、 Persistence base
You can use the parameter
innodb_stats_persistent Controls whether the cardinality is persisted , The default is off.
Of course, you can set it for a separate table
STATS_PERSISTENT=1 So it's
innodb_stats_persistent Will be automatically enabled .
The advantage of opening it is ： restart MySQL It's not going to be repeated , Speed up the restart .
Four 、 How to actively update the base ？
Execute the following SQL Will trigger InnoDB Update base （ Even if you don't realize it updates the cardinality ）.
So try to choose a business low peak period
analyze table tableName;
If the number of samples is too small , The base number of the calculation is too wrong . That's likely to lead to MySQL The optimizer for has selected the wrong index . This is that you can increase the value appropriately . But add Too much may lead to
ANALYZE TABLE slow .
ANALYZE TABLE It's too slow . You can adjust the parameters moderately
innodb_stats_persistent_sample_pages Value . But this may lead to inaccurate calculation of cardinality .
If there is no way to balance the two . Consider reducing the number of index columns in the table or limiting the number of partitions to reduce ANALYZE TABLE complexity . The number of columns in the primary key of a table is also important , Because primary key columns are attached to every non unique index .
Reference resources ：