1、超大分页怎么处理?
超大的分页一般从两个方向上来解决.
1、 数据库层面,这也是我们主要集中关注的(虽然收效没那么大),类似于select * from table where age > 20 limit 1000000,10
这种查询其实也是有可以优化的余地的、这条语句需要load1000000数据然后基本上全部丢弃,只取10条当然比较慢、当时我们可以修改为select * from table where id in (select id from table where age > 20 limit 1000000,10)
.这样虽然也load了一百万的数据,但是由于索引覆盖,要查询的所有字段都在索引中,所以速度会很快、同时如果ID连续的好,我们还可以select * from table where id > 1000000 limit 10
,效率也是不错的,优化的可能性有许多种,但是核心思想都一样,就是减少load的数据.
2、 从需求的角度减少这种请求…主要是不做类似的需求(直接跳转到几百万页之后的具体某一页.只允许逐页查看或者按照给定的路线走,这样可预测,可缓存)以及防止ID泄漏且连续被人恶意攻击.
解决超大分页,其实主要是靠缓存,可预测性的提前查到内容,缓存至Redis等k-V数据库中,直接返回即可
2、存储引擎分类有哪些以及使用场景?
存储引擎主要有
1、 MyIsam
2、 InnoDB
3、 Memory
4、 Archive
5、 Federated
默认为:InnoDB 引擎。InnoDB 底层存储结构为 B+树, B 树的每个节点对应 innodb
的一个 page,page 大小是固定的,一般设为 16k
使用场景
1、 经常更新的表,适合处理多重并发的更新请求
2、 支持事务。
3、 可以从灾难中恢复(通过 bin-log 日志等)
4、 外键约束。只有他支持外键。
5、 支持自动增加列属性 auto_increment
3、视图有哪些特点?
视图的特点如下:
1、 视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。
2、 视图是由基本表(实表)产生的表(虚表)。
3、 视图的建立和删除不影响基本表。
4、 对视图内容的更新(添加,删除和修改)直接影响基本表。
5、 当视图来自多个基本表时,不允许添加和删除数据。
视图的操作包括创建视图,查看视图,删除视图和修改视图。
4、什么是存储过程?有哪些优缺点?
「存储过程」,就是一些编译好了的SQL语句,这些SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后给这些代码块取一个名字,在用到这个功能的时候调用即可。
「优点:」
1、 存储过程是一个预编译的代码块,执行效率比较高
2、 存储过程在服务器端运行,减少客户端的压力
3、 允许模块化程序设计,只需要创建一次过程,以后在程序中就可以调用该过程任意次,类似方法的复用
4、 一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率
5、 可以一定程度上确保数据安全
「缺点:」
1、 调试麻烦
2、 可移植性不灵活
3、 重新编译问题
5、日常工作中你是怎么优化SQL的?
可以从这几个维度回答这个问题:
1、 加索引
2、 避免返回不必要的数据
3、 适当分批量进行
4、 优化sql结构
5、 分库分表
6、 读写分离
6、创建索引的原则
索引虽好,但也不是无限制的使用,最好符合一下几个原则
1、 最左前缀匹配原则,组合索引非常重要的原则,MySQL会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
2、 较频繁作为查询条件的字段才去创建索引
3、 更新频繁字段不适合创建索引
4、 若是不能有效区分数据的列不适合做索引列(如性别,男女未知,最多也就三种,区分度实在太低)
5、 尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
6、 定义有外键的数据列一定要建立索引。
7、 对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。
8、 对于定义为text、image和bit的数据类型的列不要建立索引。
7、什么是死锁?怎么解决?
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
常见的解决死锁的方法
1、 如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
如果业务不好处理,可以用分布式事务锁或者使用乐观锁
8、为表中得字段选择合适得数据类型
字段类型优先级: 整形>date,time>enum,char>varchar>blob,text
优先考虑数字类型,其次是日期或者二进制类型,最后是字符串类型,同级别得数据类型,应该优先选择占用空间小的数据类型
9、MySQL 索引使用有哪些注意事项呢?
可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则
索引哪些情况会失效
1、 查询条件包含or,可能导致索引失效
2、 如何字段类型是字符串,where时一定用引号括起来,否则索引失效
3、 like通配符可能导致索引失效。
4、 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
5、 在索引列上使用MySQL的内置函数,索引失效。
6、 对索引列运算(如,+、-、*、/),索引失效。
7、 索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
8、 索引字段上使用is null, is not null,可能导致索引失效。
9、 左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
10、 MySQL估计使用全表扫描要比使用索引快,则不使用索引。
索引不适合哪些场景
1、 数据量少的不适合加索引
2、 更新比较频繁的也不适合加索引
3、 区分度低的字段不适合加索引(如性别)
索引的一些潜规则
1、 覆盖索引
2、回表
3、 索引数据结构(B+树)
4、 最左前缀原则
5、 索引下推
10、什么是锁?
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
基本锁类型:锁包括行级锁和表级锁