SQL 优化必懂知识点

向作者提问
小马用车项目负责人,基础架构组成员,兼职mysql dba,拥有多年的互联网项目经验,曾就职于知名互联网公司,擅长数据库优化、架构设计、混编程序架构容错及设计。51cto博客总计访问量几十万+,原创文章几百篇。http://blog.51cto.com/2853725
查看本场Chat

1. 基数

单个列唯一键(distict_keys)的数量叫做基数。比如性别列,该列只有男女之分,抛开中性,所以这一列基数就是主键列的基数等于表的总行数。基数的高低影响列的数据分布。

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 列没有重复值,相当于主键。gender 列的数据分布如下:

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 列的数据分布极其不均衡,运行如下 SQL。

MariaDB [test]> select * from test where gender=1;
+----+--------+-------------+
| id | gender | phone       |
+----+--------+-------------+
|  1 |      1 | 13054480665 |
|  2 |      1 | 13167007801 |
|  4 |      1 | 13167007803 |
|  6 |      1 | 13167007805 |
+----+--------+-------------+
4 rows in set (0.00 sec)

gender 为 1 有 4 条数据,从 7 条数据里查询 4 条数据,也就是说要返回表中超过 50% 的数据。

纵享新丝滑
刚开始读就看到很多错别字
大水怪
写的不是很容易懂
奋斗: 有些概念,可以去看下数据库系统内幕或者oracle 、mysql入门的书,如有不懂,可以直接留言
Joyven
错别字太多,语句表述很有歧义。作者能不能修改一下,大家都是很认真的来学习的,但是有歧义的话,很难理解。
奋斗: 你感觉那些有歧义,可以直接问的哟
风之射手座
开篇就语句不通: 所以这一列基数就是主键列的基数等于表的总行数。 作者写完也应该自己读一遍通顺否吧。
大师兄
错别字很多,感觉帮助不太大
IT小香猪
了解一下还是有好处的
马扎学长
直接看这篇的确是看不太懂
奋斗: 有基础的小伙伴哟
木水云
您好,请教您一个问题,我怎么判断一个sql语句执行缓慢是由于网络原因造成的?
纵享新丝滑
我发现这个chat和sql优化核心思想一书第一章内容重叠,书中使用的是Oracle,此处使用MySQL,不知道作者这种抄袭来获利是否合适
微信扫描登录