下载安装mysql
1.解压tar包 cd /software tar -xzvf mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz mv mysql-5.6.21-linux-glibc2.5-x86_64 mysql-5.6.21 2.添加用户与组 groupadd mysql useradd -r -g mysql mysql chown -R mysql:mysql mysql-5.6.21 3.安装数据库 su mysql cd mysql-5.6.21/scripts ./mysql_install_db --user=mysql --basedir=/software/mysql-5.6.21 --datadir=/software/mysql-5.6.21/data 4.配置文件 cd /software/mysql-5.6.21/support-files cp my-default.cnf /etc/my.cnf cp mysql.server /etc/init.d/mysql vim /etc/init.d/mysql #若mysql的安装目录是/usr/local/mysql,则可省略此步 修改文件中的两个变动值 basedir=/software/mysql-5.6.21 datadir=/software/mysql-5.6.21/data 5.配置环境变量 vim /etc/profile export MYSQL_HOME="/software/mysql-5.6.21" export PATH="$PATH:$MYSQL_HOME/bin" source /etc/profile 6.添加自启动服务 chkconfig --add mysql chkconfig mysql on 7.启动mysql service mysql start 8.登陆mysql及改密码与配置远程访问 mysqladmin -u root password 'your_password' #修改root用户密码 mysql -u root -p #登陆mysql,须要输入密码 mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION; #容许root用户远程访问 mysql>FLUSH PRIVILEGES; #刷新权限 源码安装mysql
1. 解压 tar zxvf mariadb-5.5.31-linux-x86_64.tar.gz mv mariadb-5.5.31-linux-x86_64 /usr/local/mysql //必需这样,不少脚本或可执行程序都会直接访问这个目录 2. 权限 groupadd mysql //增长 mysql 属组 useradd -g mysql mysql //增长 mysql 用户 并归于mysql 属组 chown mysql:mysql -Rf /usr/local/mysql // 设置 mysql 目录的用户及用户组归属。 chmod +x -Rf /usr/local/mysql //赐予可执行权限 3. 拷贝配置文件 cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf //复制默认mysql配置 文件到/etc目录 4. 初始化 /usr/local/mysql/scripts/mysql_install_db --user=mysql //初始化数据库 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql //复制mysql服务程序 到系统目录 chkconfig mysql on //添加mysql 至系统服务并设置为开机启动 service mysql start //启动mysql 5. 环境变量配置 vim /etc/profile //编辑profile,将mysql的可执行路径加入系统PATH export PATH=/usr/local/mysql/bin:$PATH source /etc/profile //使PATH生效。 6. 帐号密码 mysqladmin -u root password 'yourpassword' //设定root帐号及密码 mysql -u root -p //使用root用户登陆mysql use mysql //切换至mysql数据库。 select user,host,password from user; //查看系统权限 drop user ''@'localhost'; //删除不安全的帐户 drop user root@'::1'; drop user root@127.0.0.1; select user,host,password from user; //再次查看系统权限,确保不安全的帐户均被删除。 flush privileges; //刷新权限 7. 一些必要的初始配置 1)修改字符集为UTF8 vi /etc/my.cnf 在[client]下面添加 default-character-set = utf8 在[mysqld]下面添加 character_set_server = utf8 2)增长错误日志 vi /etc/my.cnf 在[mysqld]下面添加: log-error = /usr/local/mysql/log/error.log general-log-file = /usr/local/mysql/log/mysql.log 3) 设置为不区分大小写,linux下默认会区分大小写。 vi /etc/my.cnf 在[mysqld]下面添加: lower_case_table_name=1 修改完重启:#service mysql restart
#一、下载:MySQL Community Server 5.7.16 http://dev.mysql.com/downloads/mysql/ #二、解压 若是想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\mysql-5.7.16-winx64
添加环境变量前如何使用,在命令行中(c或cd mysql路径) #三、添加环境变量 【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【将MySQL的bin目录路径追加到变值值中,用 ; 分割】 #四、初始化 mysqld --initialize-insecure #五、启动MySQL服务 mysqld # 启动MySQL服务 #六、启动MySQL客户端并链接MySQL服务 mysql -u root -p # 链接MySQL服务器
上一步解决了一些问题,但不够完全,由于在执行【mysqd】启动MySQL服务器时,当前终端会被hang住,那么作一下设置便可解决此问题: 注意:--install前,必须用mysql启动命令的绝对路径 # 制做MySQL的Windows服务,在终端执行此命令: "c:\mysql-5.7.16-winx64\bin\mysqld" --install # 移除MySQL的Windows服务,在终端执行此命令: "c:\mysql-5.7.16-winx64\bin\mysqld" --remove 注册成服务以后,之后再启动和关闭MySQL服务时,仅需执行以下命令: # 启动MySQL服务 net start mysql # 关闭MySQL服务 net stop mysql -------------------------------------------------------------------------- 也可使用 mysqld --install sc delete mysql #注意这里是mysql不是mysqld
登陆,设置/修改密码linux
初始状态下,管理员root,密码为空,默认只容许从本机登陆localhost 设置密码 [root@egon ~]# mysqladmin -uroot password "123" 设置初始密码 因为原密码为空,所以-p能够不用 [root@egon ~]# mysqladmin -uroot -p"123" password "456" 修改mysql密码,由于已经有密码了,因此必须输入原密码才能设置新密码 命令格式: [root@egon ~]# mysql -h172.31.0.2 -uroot -p456 [root@egon ~]# mysql -uroot -p [root@egon ~]# mysql 以root用户登陆本机,密码为空
忘记密码面试
linux平台下,破解密码的两种方式sql
[root@egon ~]# rm -rf /var/lib/mysql/mysql #全部受权信息所有丢失!!! [root@egon ~]# systemctl restart mariadb [root@egon ~]# mysql
[root@egon ~]# vim /etc/my.cnf #mysql主配置文件 [mysqld] skip-grant-table [root@egon ~]# systemctl restart mariadb [root@egon ~]# mysql MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost"; MariaDB [(none)]> flush privileges; MariaDB [(none)]> \q [root@egon ~]# #打开/etc/my.cnf去掉skip-grant-table,而后重启 [root@egon ~]# systemctl restart mariadb [root@egon ~]# mysql -u root -p123 #以新密码登陆
windows平台下,5.7版本mysql,破解密码的两种方式数据库
#1 关闭mysql #2 在cmd中执行:mysqld --skip-grant-tables #3 在cmd中执行:mysql #4 执行以下sql: update mysql.user set authentication_string=password('') where user = 'root'; flush privileges; #5 tskill mysqld #或taskkill -f /PID 7832 #6 从新启动mysql
#1. 关闭mysql,能够用tskill mysqld将其杀死 #2. 在解压目录下,新建mysql配置文件my.ini #3. my.ini内容,指定 [mysqld] skip-grant-tables #4.启动mysqld #5.在cmd里直接输入mysql登陆,而后操做 update mysql.user set authentication_string=password('') where user='root and host='localhost'; flush privileges; #6.注释my.ini中的skip-grant-tables,而后启动myqsld,而后就能够以新密码登陆了
四、统一字符编码vim
#找到mysql文件,打开,找到my-default,复制一份,在mysql文件夹外边修改,在拉到mysql中 #1. 修改配置文件 [mysqld] default-character-set=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8 #mysql5.5以上:修改方式有所改动 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8 #2. 重启服务 #3. 查看修改结果: \s show variables like '%char%'
#配置文件在哪 window ----my.ini liunx ----/etc/my.cnf #二进制文件bin_log 主要用于主从复制 #错误日志log-error 默认是关闭的,记录严重的警告和错误信息, 和启动和关闭的详细信息 #查询日志log 默认关闭,记录查询的sql语句,若是开启会下降MySQL的总体性能 #数据文件 1、frm文件,存放表结构 2、myd文件 存放表数据 3、myi文件 存放表索引
本文介绍,在Windows10系统下,如何完全删除卸载MySQL。。。 1》中止MySQL服务 服务,将MySQL服务中止。 2》卸载mysql server 控制面板\全部控制面板项\程序和功能,将mysql server卸载掉。 3》将MySQL安装目录下的MySQL文件夹删除(个人安装目录是C:\Program Files (x86)\MySQL) 4》运行“regedit”文件,打开注册表。 删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL文件夹 删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL文件夹。 删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL的文件夹。 若是没有相应的文件夹,就不用删除了。 5》删除C盘下的“C:\ProgramData\MySQL ”文件夹,若是删除不了则用360粉碎掉便可, 该programData文件默认是隐藏的,设置显示后便可见,或者直接复制 C:\ProgramData 到地址栏回车便可进入! 将整个MySQL文件夹删除掉。。。 6》查看服务,是否已经删除,若是还在系统服务里。又不想改服务名,改怎么办呢。 只要在CMD里输入一条命令就能够将服务删除: sc delete mysql //这里的mysql是你要删除的服务名 而后,就能够重装MySQL数据库了!!!
作业务,要懂基本的SQL语句;windows
作性能优化,要懂索引,懂引擎;缓存
作分库分表,要懂主从,懂读写分离...安全
数据库的使用,是开发人员的基本功,对它掌握越清晰越深刻,你能作的事情就越多。性能优化
今天咱们用10分钟,重点梳理一遍如下几方面:
数据库知识点汇总;
数据库事务特性和隔离级别;
详解关系型数据库、索引与锁机制;
数据库调优与最佳实践;
面试考察点及加分项。
1、数据库的不一样类型
1.经常使用的关系型数据库
Oracle:功能强大,主要缺点就是贵
MySQL:互联网行业中最流行的数据库,这不只仅是由于MySQL的免费。能够说关系数据库场景中你须要的功能,MySQL都能很好的知足,后面详解部分会详细介绍MySQL的一些知识点
MariaDB:是MySQL的分支,由开源社区维护,MariaDB虽然被看做MySQL的替代品,但它在扩展功能、存储引擎上都有很是好的改进
PostgreSQL:也叫PGSQL,PGSQL相似于Oracle的多进程框架,能够支持高并发的应用场景,PG几乎支持全部的SQL标准,支持类型至关丰富。PG更加适合严格的企业应用场景,而MySQL更适合业务逻辑相对简单、数据可靠性要求较低的互联网场景。
2.NoSQL数据库(非关系型数据库)
Redis:提供了持久化能力,支持多种数据类型。Redis适用于数据变化快且数据大小可预测的场景。
MongoDB:一个基于分布式文件存储的数据库,将数据存储为一个文档,数据结构由键值对组成。MongoDB比较适合表结构不明确,且数据结构可能不断变化的场景,不适合有事务和复杂查询的场景。
HBase:创建在HDFS,也就是Hadoop文件系统之上的分布式面向列的数据库。相似于谷歌的大表设计,HBase能够提供快速随机访问海量结构化数据。在表中它由行排序,一个表有多个列族以及每个列族能够有任意数量的列。 HBase依赖HDFS能够实现海量数据的可靠存储,适用于数据量大,写多读少,不须要复杂查询的场景。
Cassandra:一个高可靠的大规模分布式存储系统。支持分布式的结构化Key-value存储,以高可用性为主要目标。适合写多的场景,适合作一些简单查询,不适合用来作数据分析统计。
Pika:一个可持久化的大容量类Redis存储服务, 兼容五种主要数据结构的大部分命令。Pika使用磁盘存储,主要解决Redis大容量存储的成本问题。
3.NewSQL数据库(新一代关系型数据库)
TiDB:开源的分布式关系数据库,几乎彻底兼容MySQL,可以支持水平弹性扩展、ACID事务、标准SQL、MySQL语法和MySQL协议,具备数据强一致的高可用特性。既适合在线事务处理,也适合在线分析处理。
OceanBase:OceanBase是蚂蚁金服的数据库,OB是能够知足金融级的可靠性和数据一致性要求的数据库系统。当你须要使用事务,而且数据量比较大,就比较适合使用OB。不过目前OB已经商业化,再也不开源。
2、事物特性及事物类型
后面的详解知识点会展开介绍
3、数据库的范式
前关系数据库有六种范式:第一范式、第二范式、第三范式、巴斯-科德范式(BCNF)、第四范式和第五范式。范式级别越高对数据表的要求越严格。
第一范式要求最低,只要求表中字段不可用在拆分。
第二范式在第一范式的基础上要求每条记录由主键惟一区分,记录中全部属性都依赖于主键。
第三范式在第二范式的基础上,要求全部属性必须直接依赖主键,不容许间接依赖。
通常说来,数据库只需知足第三范式就能够了。
详解知识点一:数据库事务
知识点
▌1.数据库事务特性
数据库的特性是面试时考察频率很是高的题目,共4个特性:
原子性:是指事务由原子的操做序列组成,全部操做要么所有成功,要么所有失败回滚。
一致性:是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行以前和执行以后,数据库都必须处以一致性状态。好比在作多表操做时,多个表要么都是事务后新的值,要么都是事务前的旧值。
隔离性:是指多个用户并发访问数据库时,数据库为每一个用户执行的事务,不能被其余事务的操做所干扰,多个并发事务之间要相互隔离。事务的隔离级别咱们稍后介绍。
持久性:是指一个事务一旦提交并执行成功,那么对数据库中数据的改变就是永久性的,即使是在数据库系统遇到故障的状况下也不会丢失提交事务的操做。
▌2.事物并发问题与隔离级
a.事务并发问题
脏读:脏读是指在一个事务处理过程里读取了另外一个未提交的事务中的数据,例如,帐户A转账给B500元,B余额增长后但事务尚未提交完成,此时若是另外的请求中获取的是B增长后的余额,这就发生了脏读,由于事务若是失败回滚时,B的余额就不该该增长。
不可重复读:不可重复读是指对于数据库中某个数据,一个事务范围内屡次查询返回了不一样的数据值,这是因为在屡次查询之间,有其余事务修改了数据并进行了提交。
幻读:是指一个事务中执行两次彻底相同的查询时,第二次查询所返回的结果集跟第一个查询不相同。与不可重复读的区别在于,不可重复读是对同一条记录,两次读取的值不一样。而幻读是记录的增长或删除,致使两次相同条件获取的结果记录数不一样。
b:事务的四种隔离级别
能够用于解决这几种并发问题。如图右面,由上到下的4种隔离级别由低到高。
级别1读未提交:也就是能够读取到其余事务未提交的内容,这是最低的隔离级别,这个隔离级别下,前面提到的三种并发问题都有可能发生。
级别2读已提交:就是只能读取到其余事务已经提交的数据。这个隔离级别能够解决脏读问题。
级别三可重复读:能够保证整个事务过程当中,对同数据的屡次读取结果是相同的。这个级别能够解决脏读和不可重复读的问题。MySQL默认的隔离级别就是可重复读。
级别四串行化:这是最高的隔离级别,全部事务操做都依次顺序执行。这个级别会致使并发度降低,性能最差。不过这个级别能够解决前面提到的全部并发问题。
▌3.事务分类
共分5大类:
扁平化事务:在扁平事务中,全部的操做都在同一层次,这也是咱们平时使用最多的一种事务。它的主要限制是不能提交或者回滚事务的某一部分,要么都成功,要么都回滚。
带保存点的扁平事务:为了解决第一种事务的弊端,就有了第二种带保存点的扁平事务。它容许事务在执行过程当中回滚到较早的状态,而不是所有回滚。经过在事务中插入保存点,当操做失败后,能够选择回滚到最近的保存点处。
链事务:能够看作是第二种事务的变种。它在事务提交时,会将必要的上下文隐式传递给下一个事务,当事务失败时就能够回滚到最近的事务。不过,链事务只能回滚到最近的保存点,而带保存点的扁平化事务是能够回滚到任意的保存点。
嵌套事务:由顶层事务和子事务构成,相似于树的结构。通常顶层事务负责逻辑管理,子事务负责具体的工做,子事务能够提交,但真正提交要等到父事务提交,若是上层事务回滚,那么全部的子事务都会回滚。
分布式事务:是指分布式环境中的扁平化事务。
其中,经常使用的分布式事务解决方案共4种
a.XA协议:是保证强一致性的刚性事务。实现方式有两段式提交和三段式提交。两段式提交须要有一个事务协调者来保证全部的事务参与者都完成了第一阶段的准备工做。若是协调者收到全部参与者都准备好的消息,就会通知全部的事务执行第二阶段提交。通常场景下两段式提交已经可以很好得解决分布式事务了,然而两阶段在即便只有一个进程发生故障时,也会致使整个系统存在较长时间的阻塞。三段式提交经过增长Pre-commit阶段来减小前面提到的系统阻塞的时间。三段式提交不多在实际中使用,简单了解就能够了。
b.TCC:是知足最终一致性的柔性事务方案。TCC采用补偿机制,核心思想是对每一个操做,都要注册对应的确认和补偿操做。它分为三个阶段:Try阶段主要对业务系统进行检测及资源预留;Confirm阶段对业务系统作确认提交。Cancel阶段是在业务执行错误,执行回滚,释放预留的资源。
c.消息事务:第三种方案是消息一致性方案。基本思路是将本地操做和发送消息放在一个事务中,保证本地操做和消息发送要么都成功要么都失败。下游应用订阅消息,收到消息后执行对应操做。
d.GTS/Fescar:阿里云中的全局事务服务GTS,对应的开源版本是Fescar。Fescar基于两段式提交进行改良,剥离了分布式事务方案对数据库在协议支持上的要求。使用Fescar的前提是分支事务中涉及的资源,必须是支持ACID事务的关系型数据库。分支的提交和回滚机制,都依赖于本地事务来保障。 Fescar的实现目前还存在一些局限,好比事务隔离级别最高支持到读已提交级别。
详解知识点二:MySQL数据库
▌1.经常使用SQL语句
须要能手写经常使用SQL语句,这里没有什么特殊的技巧,根据如图列出的语句类型多作一些练习
▌2.数据类型
要知道MySQL都提供哪些基本都数据类型,不一样数据类型占用的空间大小。
▌3.MySQL中主要的存储引擎
MyISAM是MySQL官方提供的存储引擎,其特色是支持全文索引,查询效率比较高,缺点是不支持事务、使用表级锁。InnoDB在5.5版本后成为了Mysql的默认存储引擎,特色是支持ACID事务、支持外键、支持行级锁提升了并发效率。TokuDB是第三方开发的开源存储引擎,有很是快的写速度,支持数据的压缩存储、能够在线添加索引而不影响读写操做。可是由于压缩的缘由,TokuDB很是适合访问频率不高的数据或历史数据归档,不适合大量读取的场景。
▌4.MySQL中的锁
MyIASAM使用表级锁,InnoDB使用行级锁。表锁开销小,加锁快,不会出现死锁;可是锁的粒度大,发生锁冲突的几率高,并发访问效率比较低。行级锁开销大,加锁慢,有可能会出现死锁,不过由于锁定粒度最小,发生锁冲突的几率低,并发访问效率比较高。
注:
共享锁也就是读锁,其余事务能够读,但不能写。MySQL能够经过Lock In Share Mode语句显示使用共享锁。
排他锁就是写锁,其余事务不能读取,也不能写。对于Update、Delete和INSERT语句,InnoDB会自动给涉及的数据集加排他锁,或者使用select for update显示使用排他锁。
▌5.索引
后文重点讲解
▌6.MySQL的存储过程与函数
存储过程和函数均可以免开发人员重复编写相同的SQL语句,而且存储过程和函数都是在MySQL服务器中执行的,能够减小客户端和服务器端的数据传输。
存储过程可以实现更复杂的功能,而函数通常用来实现针对性比较强的功能,例如特殊策略求和等。存储过程能够执行包括修改表等一系列数据库操做,而用户定义函数不能用于执行修改全局数据库状态的操做。
存储过程通常是做为一个独立的部分来执行,而函数能够做为查询语句的一个部分来调用。SQL语句中不能使用存储过程,但可使用函数。
不过存储过程通常与数据库实现绑定,使用存储过程会下降程序的可移植性,应谨慎使用。
▌7.新特性
能够了解MySQL8.0的一些新特性,例如默认字符集格式改成了UTF8;增长了隐藏索引的功能,隐藏后的索引不会被查询优化器使用,可使用这个特性用于性能调试;支持了通用表表达式,使复杂查询中的嵌入表语句更加清晰;新增了窗口函数的概念,它能够用来实现新的查询方式。窗口函数与 SUM、COUNT等集合函数相似,但不会将多行查询结果合并,而是将结果放在多行中。即窗口函数不须要GROUP BY。
▌8.MySQL调优
后文重点讲解。
➔重点讲解一:MySQL索引
索引能够大幅增长数据库的查询的性能,在实际业务场景中,或多或少都会使用到。
可是索引是有以下2个代价的:
a.须要额外的磁盘空间来保存索引
b.对于插入、更新、删除等操做因为更新索引会增长额外的开销
所以索引比较适合用在读多写少的场景。
▌1.MySQL索引类型
如左面的模块,共分为5类:
惟一索引:就是索引列中的值必须是惟一的,可是容许出现空值。这种索引通常用来保证数据的惟一性,好比保存帐户信息的表,每一个帐户的id必须保证惟一,若是重复插入相同的帐户id时会MySQL返回异常。
主键索引:是一种特殊的惟一索引,可是它不容许出现空值。
普通索引:与惟一索引不一样,它容许索引列中存在相同的值。例如学生的成绩表,各个学科的分数是容许重复的,就可使用普通索引。
联合索引:就是由多个列共同组成的索引。一个表中含有多个单列的索引并非联合索引,联合索引是对多个列字段按顺序共同组成一个索引。应用联合索引时须要注意最左原则,就是Where查询条件中的字段必须与索引字段从左到右进行匹配。好比,一个用户信息表,用姓名和年龄组成了联合索引,若是查询条件是姓名等于张三,那么知足最左原则;若是查询条件是年龄大于20,因为索引中最左的字段是姓名不是年龄,因此不能使用这个索引。
全文索引:前面提到了,MyISAM引擎中实现了这个索引,在5.6版本后InnoDB引擎也支持了全文索引,而且在5.7.6版本后支持了中文索引。全文索引只能在CHAR,VARCHAR,TEXT类型字段上使用,底层使用倒排索引实现。要注意对于大数据量的表,生成全文索引会很是消耗时间也很是消耗磁盘空间。
▌2.索引实现
如右面的模块,索引实现共分4种形式:
B+树实现:b+树比较适合用做'>'或'<'这样的范围查询,是MySQL中最常使用的一种索引实现。
R-tree:是一种用于处理多维数据的数据结构,能够对地理数据进行空间索引。不过实际业务场景中使用的比较少。
Hash:是使用散列表来对数据进行索引,Hash方式不像Btree那样须要屡次查询才能定位到记录,所以Hash索引的效率高于B-tree,可是不支持范围查找和排序等功能.实际使用的也比较少。
FullText:就是咱们前面提到的全文索引,是一种记录关键字与对应文档关系的倒排索引。
➔重点讲解二:MySQL调优
MySQL的调优也是研发人员须要掌握的一项技能
通常MySQL调优有图中的4个纬度:
针对数据库设计、表结构设计以及索引设置纬度进行的优化;
对业务中使用的SQL语句进行优化,例如调整Where查询条件;
对mysql服务的配置进行优化,例如对连接数的管理,对索引缓存、查询缓存、排序缓存等各类缓存大小进行优化;
对硬件设备和操做系统设置进行优化,例如调整操做系统参数、禁用Swap、增长内存、升级固态硬盘等等。
这四个纬度从优化的成本角度来说,从左到右优化成本逐渐升高;从优化效果角度来看,从右到左优化的效果更高。
对于研发人员来讲,前两个纬度与业务息息相关,所以须要重点掌握,后两个纬度更适合DBA进行深刻学习,简单了解就好。
本文将重点关注前两个纬度
▌1.表结构和索引的优化
如左面的模块,应该掌握以下6个原则:
第1个原则:要在设计表结构时,考虑数据库的水平与垂直扩展能力,提早规划好将来1年的数据量、读写量的增加,规划好分库分表方案。好比设计用户信息表,预计1年后用户数据10亿条,写QPS约5000,读QPS30000,能够设计按UID纬度进行散列,分为4个库每一个库32张表,单表数据量控制在KW级别;
第2个原则:要为字段选择合适的数据类型,在保留扩展能力的前提下,优先选用较小的数据结构。例如保存年龄的字段,要使用TINYINT而不要使用INT;
第3个原则:能够将字段多的表分解成多个表,必要时增长中间表进行关联。假如一张表有四、50个字段显然不是一个好的设计;
第4个原则:是设计关系数据库时须要知足第三范式,但为了知足第三范式,咱们可能会拆分出多张表。而在进行查询时须要对多张表进行关联查询,有时为了提升查询效率,会下降范式的要求,在表中保存必定的冗余信息,也叫作反范式。但要注意反范式必定要适度;
第5个原则:要擅用索引,好比为常常做为查询条件的字段建立索引、建立联合索引时要根据最左原则考虑索引的复用能力,不要重复建立索引;要为保证数据不能重复的字段建立惟一索引等等。不过要注意索引对插入、更新等写操做是有代价的,不要滥用索引。好比像性别这样惟一不好的字段就不适合创建索引;
第6个原则:列字段尽可能设置为Not Null,MySQL难以对使用Null的列进行查询优化,容许Null会使索引、索引统计和值更加复杂。容许Null值的列须要更多的存储空间,还须要MySQL内部进行特殊处理。
▌2.SQL语句进行优化的原则
如右面的模块,共分5个原则:
第1个原则:要找的最须要优化的SQL语句。要么是使用最频繁的语句,要么是优化后提升最明显的语句,能够经过查询MySQL的慢查询日志来发现须要进行优化的SQL语句;
第2个原则:要学会利用MySQL提供的分析工具。例如使用Explain来分析语句的执行计划,看看是否使用了索引,使用了哪一个索引,扫描了多少记录,是否使用文件排序等等。或者利用Profile命令来分析某个语句执行过程当中各个分步的耗时;
第3个原则:要注意使用查询语句是要避免使用Select *,而是应该指定具体须要获取的字段。缘由一是能够避免查询出不须要使用的字段,二是能够避免查询列字段的元信息;
第4个原则:是尽可能使用Prepared Statements,一个是性能更好,另外一个是能够防止SQL注入;
第5个原则:是尽可能使用索引扫描来进行排序,也就是尽可能在有索引的字段上进行排序操做。
以上为数据库操做须掌握的内容,能够进行差缺补漏,但愿对研发人员有必定的帮助
面试考察点
面试考察点
1.必须了解数据库的基本原理、使用场景以及经常使用队列、数据库的特色。MySQL提供了多种引擎能够支持事务型与非事务型的关系对象库服务等等。
2.要深入理解数据库事务的ACID特性,了解并发事务可能致使的并发问题和不一样的数据库隔离级别如何解决这些并发问题。
3.要掌握经常使用的MySQL语句,好比WHERE条件查询语句、JOIN关联语句、ORDER BY排序语句等等。还要熟悉经常使用的自带函数,例如SUM、COUNT等等。
4.要了解MySQL数据库不一样引擎的特色及不一样类型的索引实现。好比最长使用的InnoDB很是擅长事务处理,MyISAM比较适合非事务的简单查询场景。好比知道MySQL的惟一索引、联合索引、全文索引等不一样索引类型,以及最长使用等B+树索引实现等等。
面试加分项
面试加分项
1.要了解新特性,例如MySQL8.0中提供了窗口函数来支持新的查询方式;支持通用表表达式,使复杂查询中的嵌入表语句更加清晰等等。
2.要知道数据库表设计原则,若是有过线上业务数据库的设计经验就更好了,你可以知道如何对容量进行评估,也知道适当分库分表来保证将来服务的可扩展性,这会对面试起到积极的影响。
3.最好有过数据库调优经验,例如明明创建了索引的语句,可是查询效率仍是很慢,经过Explain分析发现表中有多个索引,MySQL的优化器选用了错误的索引,致使查询效率偏低,而后经过在SQL语句中使用Use Index来指定索引解决。