mysql面试

目录

数据库的优化方案

表优化

SQL怎么优化

mysql索引的好处

哪些情况会出现索引失效

索引的原理

MYISAM和InnoDB区别

 聚集索引与非聚集索引的区别

 事务的四大特性

事务的并发问题

事务的隔离级别

 数据库三范式

mvcc

mycat与shardingsphere比较


数据库的优化方案


1.优化索引,sql语句,分析慢查询
2.设计表的时候严格按照数据库设计规范来设计数据库
3.使用缓存,把京城访问并且不需要经常变化的数据放在缓存中,能够节约磁盘IO
4.优化硬件,采用ssd,使用磁盘队列技术(RAID0, RAID1,RAID5)
5.采用mysql自带的表分区技术,把数据分析分成不同文件,能够磁盘的读写效率
6.垂直分表,把一些不经常读的数据放在一张表当中,节约磁盘IO
7.主从分离读写,采用主从复制把数据库的读操作和写操作分离开来
8.分库分表分机器,数据量特别大的时候,主要的原理是数据路由
9.选择合适的表引擎,参数上的优化
10进行架构级别的缓存,静态化和分布式
11不采用全文检索
12.采用更快的存储方恨少,例如nosql存储经常访问的数据

表优化


1.优化表结构
* 尽量将表字段定义为NOT NULL约束(即使可以为空,补空字符串),这时由于在MySQL中含有空值的列很难进行查询优化,NULL值会使索引以及索引的统计信息变得很复杂。
* 对于只包含特定类型的字段,可以使用enum、set 等数据类型。
* 数值型字段的比较比字符串的比较效率高得多,字段类型尽量使用最小、最简单的数据类型。例如IP地址可以使用int类型。
* 尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED。但对整数类型指定宽度,比如INT(11),没有任何用,因为指定的类型标识范围已经确定。
* VARCHAR的长度只分配真正需要的空间
* 尽量使用TIMESTAMP而非DATETIME,但TIMESTAMP只能表示1970 - 2038年,比DATETIME表示的范围小得多,而且TIMESTAMP的值因时区不同而不同。
* 单表不要有太多字段,建议在20以内
* 合理的加入冗余字段可以提高查询速度。
* 列名不要过长,控制20个字符以内,不要中文字段名
2. 表拆分
2.1 垂直拆分
​    垂直拆分按照字段进行拆分,其实就是把组成一行的多个列分开放到不同的表中,这些表具有不同的结构,拆分后的表具有更少的列。例如用户表中的一些字段可能经常访问,可以把这些字段放进一张表里。另外一些不经常使用的信息就可以放进另外一张表里。
​    插入的时候使用事务,也可以保证两表的数据一致。缺点也很明显,由于拆分出来的两张表存在一对一的关系,需要使用冗余字段,而且需要join操作。但是我们可以在使用的时候可以分别取两次,这样的来说既可以避免join操作,又可以提高效率。
​    查询单表时,效率大大提升
2.2 水平拆分
​    水平拆分按照行进行拆分,常见的就是分库分表。以用户表为例,可以取用户ID,然后对ID取10的余数,将用户均匀的分配进这 0-9这10个表中。查找的时候也按照这种规则,又快又方便。
​    有些表业务关联比较强,那么可以使用按时间划分的。例如每天的数据量很大,需要每天新建一张表。这种业务类型就是需要高速插入,但是对于查询的效率不太关心。表越大,插入数据所需要索引维护的时间也就越长。
3.表分区
​    分区适用于例如日志记录,查询少。一般用于后台的数据报表分析。对于这些数据汇总需求,需要很多日志表去做数据聚合,我们能够容忍1s到2s的延迟,只要数据准确能够满足需求就可以。
​    MySQL主要支持4种模式的分区:range分区、list预定义列表分区,hash 分区,key键值分区。
4.读写分离
​    大型网站会有大量的并发访问,如果还是传统的数据存储方案,只是靠一台服务器处理,如此多的数据库连接、读写操作,数据库必然会崩溃,数据丢失的话,后果更是不堪设想。这时候,我们需要考虑如何降低单台服务器的使用压力,提升整个数据库服务的承载能力。
​    我们发现一般情况对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,这样分析可以采用数据库集群的方案。其中一个是主库,负责写入数据,我们称为写库;其它都是从库,负责读取数据,我们称为读库。这样可以缓解一台服务器的访问压力。
​    MySql自带主从复制功能,我们可以使用主从复制的主库作为写库,从库和主库进行数据同步,那么可以使用多个从库作为读库,已完成读写分离的效果。


SQL怎么优化

1.建索引
2.减少表之间的关联
3.优化 sql,尽量让 sql 很快定位数据,不要让sql 做全表查询,应该走索引,把数据 量大的表排在前面
4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
5.尽量用PreparedStatement 来查询,不要用 Statement
从sql上优化
不要在列上使用函数和进行运算
不要在列上使用函数,这将导致索引失效而进行全表扫描。
尽量避免使用 != 或 not in或 <> 等否定操作符
尽量避免使用 or 来连接条件
多个单列索引并不是最佳选择,复合索引的最左前缀原则
查询中的某个列有范围查询,则其右边所有列都无法使用索引优化查找。
索引不会包含有NULL值的列
当查询条件左右两侧类型不匹配的时候会发生隐式转换,隐式转换带来的影响就是可能导致索引失效而进行全表扫描。
like 语句的索引失效问题
做过mysql的查询优化?
1.select子句中尽量避免使用*
2.where子句比较符号左侧避免函数
3.尽量避免使用in和not in,如用between
4.尽量避免使用or,用union连接
5.使用limit子句限制返回的数据行数
6.尽可能不使用子查询,使用连接(JOIN)来代替子查询(Sub-Queries)
7.LIKE双百分号无法使用到索引,组合索引代替多个单列索引(由于mysql中每次只能使用一个索引,所以经常使用多个条件查询时更适合使用组合索引)
8.update语句如果只改一两个字段,不要update全部字段,否则频繁调用,会引起明显的性能消耗,同时带来的大量的日志

mysql索引的好处


a.创建索引可以大大提高系统的性能:
1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 
2.可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 
3.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 
4.在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 
5.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 

b.增加索引也有许多不利的方面:
1.创建索引和维护索引要耗费时间,这种

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值