MySQL问答
这是在学习的过程中,粗略的总结的一些问答,有错误还请指正
问:如果一张表内有1亿条数据,而且数据还不断增长,问你如何提高表的查询效率(随便举个例子哈)
答:为查询建立索引
这就引出了索引的问题:什么是索引,索引的目的,索引的优缺点
先简单说一下,具体的可以百度
什么是索引:索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,相字典上的目录
索引的目的:加快数据的查询速度,加快表与表之间的连接速度
索引的优缺点:
优点可以按上面的目的答
缺点:首先我们要知道,索引是要占磁盘空间的,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果你有一个很大的表,索引文件的大小可能达到操作系统允许的最大文件限制。第二,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第三,索引会影响增删改的操作性能,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
问:建立完索引查询效率还是慢呢?
如果不往下衍生的话,可以答哪些情况下SQL索引会失效,但是一般肯定会往下衍生的
所以可以答:分表(当然这只是问答,实际不可能上来就分库分表)
问:分表有哪些方式?
答:水平分表、垂直分表
- 水平分表:按业务逻辑 时间或地区, 如一个用户表中XX数据是安徽的,XX地区是江苏的,或XX数据是12月的,XX数据是11月的
- 垂直分表:比如一个表中20个字段是描述用户信息的,可以按冷热数据进行分表,想姓名,年龄等经常查询的为热数据,身高、体重等是冷数据
问:表差拆分完后,如何对表的数据合并查询?
答:使用union或union All
问:union或union All的区别
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序
Union All:对两个结果集进行并集操作,包括重复行,不进行排序
问:如果查询效率还是低怎么办?
答:通过explain来分析到底是什么原因导致查询效率慢
问:explain是什么?有什么作用?explain中的type是什么?
老样子简单说一下:当Explain 与 SQL语句一起使用时,MySQL 会显示来自优化器关于SQL执行的信息。白话文就是我会告诉你我是怎么处理SQL语句的,包括表的加载顺序,SQL的查询类型等
type:显示了连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一
高到低:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题
问:如果查询还是慢怎么办?
答:尝试使用存储过程
问:什么是存储过程
答:就是一组编译好了的SQL语句集,就像java中的方法一样去实现一些功能(对表的增删改查),将这些SQL语句集取个名字,经编译后存储在数据库中,我们可以通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它
问:存储过程的优缺点
答:优点:存储过程是一个预编译的语句集,执行效率比较高,允许模块化程序设计,只需要创建一次过程,以后在程序中就可以调用该过程任意次,类似方法的复用。缺点:调试麻烦,因为存储过程依赖于具体的数据库可移植性不灵活
问:如果查询效率还是慢怎么办?
答:数据库优化(硬件+软件)
- 硬件:提供最优的生存环境,举个例子,比如说跑步运动员A,我让它不穿跑鞋跑,然后还在沙地上跑,然后再跟同等水平的运动员B,一起比赛,B装备齐全,跑道环境都是最好的,你说谁的成绩会好呢
- 软件:可以考虑数据库优化设计,比如表的设计等等
问:如果还是慢怎么办
答:随缘吧
好的,开个玩笑,肯定还是有解决办法的
以上就是自己粗略总结的了