sql优化
阅读数:28 评论数:0
跳转到新版页面分类
数据库
正文
基数
单个列唯一键的数量叫做基数, 基数的高低影响列的数据分布 .
MariaDB [test]> select count(distinct gender),count(distinct phone) from test;
+------------------------+-----------------------+
| count(distinct gender) | count(distinct phone) |
+------------------------+-----------------------+
| 2 | 7 |
+------------------------+-----------------------+
1 row in set (0.00 sec)
test表的总行数是7, gender列的基数是2, 说明gender列里面有大量的重复值, phone列的基数等于总行数, 说明phone列没有重复值.
MariaDB [test]> select gender,count(*) from test group by gender order by 2 desc;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 1 | 4 |
| 2 | 3 |
+--------+----------+
2 rows in set (0.00 sec)
gender列的分布如上, gender为1有4条数据, 从7条数据里查询4条数据, 返回表中超过50%的数据.
有一个结论: 如果一个列基数很低, 该列数据分布不均衡, 由于该列数据分布极不均衡, 会导致SQL查询可能走索引, 也可能走全表扫描.
在做SQL优化时, 如果怀疑该列数据分布不均衡, 我们可以使用select列, count(*) from 表 group by 列 order by 2 desc来查看列的数据分布.
选择性
基数与总行数的比值再乘100%就是一个列的选择性. 当一个列出现在where条件中, 该列没有创建索引并且选择性大于20%时, 那么该列必须创建索引, 从而提升SQL查询性能.
只有在大表才会产生性能问题.
回表
当对一个列创建索引之后, 索引会包含该列的键值及键值对应行所在的rowid. 通过索引中记录的rowid访问表中的数据就叫回表. 回表一般是单块读, 回表次数太多会严重影响sql性能, 如果回表次数太多, 就不应该走索引扫描, 应该直接走全表扫描.
当要查询的列也包含在索引中, 这个时候就不需要回表, 所以我们往往会建立组合索引来消除回表, 从而提升性能.
当一个sql有多个过滤条件但是只有一个列或者部分列建立索引, 这个时候会出现回表再过滤, 也需要创建组合索引, 进而消除回表再过滤, 从而提升性能.
相关推荐
Centos7的yum源中没有mysql,为了解决这个问题,我们需要先下载mysql的repo源。
一、下载mysql的repo源并安装
wget http://repo.mysql.com/mysq
如果主库已经投入使用了,此时如果需要主从同步,需要导出所表结构和数据,然后导入到从库中。这时需要注意修改/var/lib/mysql/auto.cnf中uuid。
master配
一、事务的ACID
1、Atomicity原子性
Transactions are often composed of multiple statements. Atomicity guarantee
一、登录mysql
mysql --version
-查看Mysql版本
mysql -h hostname -u username -p
-h:运行mysql服务器的机器,如果正在该机器上运行此命令
一、语法
select [optioins] items
[into file_details]
from tables
[where conditions]
[group by gr
一、语法
update [low_priority] [ignore] tablename
set column1=expression1,...
[where condition]
[order b
一、语法
1、基本语法
alter table [ignore] tablename alteration [,alteration...]
(1)ignore,如果会导致唯一键重复,则这些操作将自动