一般我们优化数据库一般我们优化数据库
1. 架构上去优化1. 架构上去优化
2. db上优化2. db上优化
80% ----sql的优化(如果数据库不跑SQL,肯定就不会出性能问题)80% ----sql的优化(如果数据库不跑SQL,肯定就不会出性能问题)
20% -----参数的优化、配置,硬件20% -----参数的优化、配置,硬件
优SQL优化,知道思路,立马搞定优SQL优化,知道思路,立马搞定
基数(Cardinality) 也就是列唯一键(Distinct_keys)的数量,比如性别,该列只有男女之分,所基数(Cardinality) 也就是列唯一键(Distinct_keys)的数量,比如性别,该列只有男女之分,所
以这一列基数是2。主键列的基数等于行数。以这一列基数是2。主键列的基数等于行数。
非主键列的基数怎么算?非主键列的基数怎么算?
select count(distinct column_name) from tableselect count(distinct column_name) from table
选择性(Selectivity) : 列唯一键(Distinct_Keys)与行数(Num_Rows)的比值选择性(Selectivity) : 列唯一键(Distinct_Keys)与行数(Num_Rows)的比值
跟 走不走 索引 有木有 关系? 有一点关系跟 走不走 索引 有木有 关系? 有一点关系
一般来说基数越多,返回的数据就越少。这样的列也更适合去建索引。所以正常情况下 基数越多一般来说基数越多,返回的数据就越少。这样的列也更适合去建索引。所以正常情况下 基数越多
,越适合建立索引.列的基数太低,就并不适合建立索引。,越适合建立索引.列的基数太低,就并不适合建立索引。
基数和选择性 这两个概念非常重要,在OLTP系统中,基数/选择性高的列,适合建立B-Tree索引,基数和选择性 这两个概念非常重要,在OLTP系统中,基数/选择性高的列,适合建立B-Tree索引,
选择性低的列不适合建立索引。在OLAP环境中,基数低的列根据需求,可能会建立bitmap索引选择性低的列不适合建立索引。在OLAP环境中,基数低的列根据需求,可能会建立bitmap索引
OLTP千万不能建位图索引。如1000W行的表,999W男,1W女。在性别列上创建了位图索引后,如比OLTP千万不能建位图索引。如1000W行的表,999W男,1W女。在性别列上创建了位图索引后,如比
一个性别为男的列进行DML,会导致999W性别为男的列都被锁定。如果有多个人同时DML性能男的一个性别为男的列进行DML,会导致999W性别为男的列都被锁定。如果有多个人同时DML性能男的
列,数据库直接死了,不多说。列,数据库直接死了,不多说。
我们在进行SQL调优的时候,可以用下面SQL去查看列真实的基数和选择性我们在进行SQL调优的时候,可以用下面SQL去查看列真实的基数和选择性
select count(distinct column_name),select count(distinct column_name),
count(*) total_rows,count(*) total_rows,
count(distinct column_name) / count(*) * 100 selectivitycount(distinct column_name) / count(*) * 100 selectivity
from table_namefrom table_name
作业:作业:
1、写个脚本,基数低的列,建立了索引 -----选出来1、写个脚本,基数低的列,建立了索引 -----选出来
select column_nameselect column_name
from (select c.column_name,from (select c.column_name,
round(c.num_distinct / t.num_rows * 100, 2) selectivityround(c.num_distinct / t.num_rows * 100, 2) selectivity
from dba_tab_col_statistics c, dba_tables tfrom dba_tab_col_statistics c, dba_tables t
where c.table_name = t.table_namewhere c.table_name = t.table_name
评论