MySQL相关

Posted kingshine007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL相关相关的知识,希望对你有一定的参考价值。

一、SELECT语句的执行顺序

from->on->join->where->group by->聚集函数->having->计算表达式->select->distinct->order by->top

二、存储过程

存储过程是一个可编程的函数,它在数据库中创建并保存。优点有:

1、存储过程能实现较快的执行速度

2、存储过程允许标准组件式编程。

3、存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

4、存储过程可被作为一种安全机制来充分利用。

5、存储过程能够减少网络流量

存储过程和函数的异同点

相同点:存储过程和函数都是为了可重复的执行操作数据库的sql 语句的集合。

不同点:

1、标识符不同,函数的标识符是function,存储过程是proceduce。

2、函数中有返回值,且必须有返回值,而过程没有返回值,但是可以通过设置参数类型(in,out)来实现多个参数或者返回值。

3、函数使用select 调用,存储过程需要使用call 调用。

三、事务的特性

1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。

2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。

3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。

4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

四、数据库索引

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B_TREE。B_TREE 索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据;相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。

五、mysql引擎

主要MyISAM 与InnoDB 两个引擎,其主要区别如下:

InnoDB 支持事务,MyISAM 不支持,即是否支持回滚;

InnoDB 支持外键,MyISAM 不支持;

InnoDB 支持行锁;

MyISAM 是默认引擎,InnoDB 需要指定;

InnoDB 不支持FULLTEXT 类型的索引;

InnoDB 中不保存表的行数,MyISAM 只要简单的读出保存好的行数即可;

对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在MyISAM 表中可以和其他字段一起建立联合索引;

清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表;

MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到安全性较高的应用;

六、数据库优化

1、选择合适的存储引擎。如果需要事务处理,使用InnoDB,如果不需要使用MyISAM

2、尽量避免全表扫描,首先考虑在where及order by涉及的列上建立索引

3、避免在where子句中使用null判断、!=或<>、or操作,否则引擎将放弃使用索引,进行全表扫描

4、update如果只更改少量字段,不要update全部字段

5、对于多张大数量的表JOIN,要先分页再JOIN

6、使用缓存,把经常访问到且不需要经常变化的数据放到缓存,节约磁盘IO

7、垂直分表,把一些不经常读的数据放在一张表里,节约磁盘IO

8、主从分离读写,采用主从复制把数据库的读操作和写操作分离开来

9、分库分表分机器,数据量比较大时,原理为数据路由

10、优化硬件,采用SSD,使用磁盘队列技术。采用更快的存储方式,使用NoSQL存储经常访问的数据。

七、数据库分区、分表

分表可以通过三种方式:Mysql 集群、自定义规则和merge 存储引擎。

分区有四类:
RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。
LIST 分区:类似于按RANGE 分区,区别在于LIST 分区是基于列值匹配一个离散值集合中的某个值来进行选择。
HASH 分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
KEY 分区:类似于按HASH 分区,区别在于KEY 分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

八、SQL注入以及如何防止

程序开发过程中不注意规范书写sql 语句和对特殊字符进行过滤,导致客户端可以通过POST 和GET 提交一些sql 语句正常执行,产生Sql 注入。

防止SQL注入的办法:

1、过滤掉一些常见的数据库操作关键字

2、在php 配置文件中将Register_globals=off,开启PHP 安全模式:Safe_mode=on;

3、提高数据库命名技巧,对于一些重要的字段根据程序的特点命名

4、打开magic_quotes_gpc 来防止SQL 注入

5、关闭错误提示信息,将错误信息写到系统日志

九、NoSQL与关系数据库的区别

1、SQL 数据存在特定结构的表中;NoSQL 则更加灵活和可扩展,存储方式可以是JSON 文档、哈希表或者其他方式。

2、SQL 中必须定义好表和字段结构后才能添加数据,在NoSQL 中,数据可以在任何时候任何地方添加,不需要先定义表。

3、SQL 中可以使用JOIN将多个关系数据表中的数据用一条简单的查询语句查询出来。NoSQL 无,也正因为此,性能提升。

4、SQL 中不允许删除已经被使用的外部数据,而NoSQL 中可以随时删除任何数据。

5、SQL 中如果多张表数据需要同批次被更新,如果其中一张表更新失败的话其他表也不能更新成功。这种场景可以通过事务来控制。而NoSQL 中没有事务这个概念,每一个数据集的操作都是原子级的。

十、数据库负载均衡

负载均衡集群是由一组相互独立的计算机系统构成,通过常规网络或专用网络进行连接,由路由器衔接在一起,各节点相互协作、共同负载、均衡压力,对客户端来说,整个群集可以视为一台具有超高性能的独立服务器。

实现原理

实现数据库的负载均衡技术,首先要有一个可以控制连接数据库的控制端。该控制端截断了数据库和程序的直接连接,由所有的程序来访问这个中间层,然后再由中间层来访问数据库。这样,我们就可以具体控制访问某个数据库了,然后还可以根据数据库的当前负载采取有效的均衡策略,来调整每次连接到哪个数据库。

负载均衡,最重要的就是所有服务器的数据都是实时同步的。

比较常用的方法是Moebius for SQL Server 集群,该集群将核心程序驻留在每个机器的数据库中,这个核心程序称为Moebius for SQL Server中间件,主要作用是监测数据库内数据的变化并将变化的数据同步到其他数据库中。数据同步完成后客户端才会得到响应,同步过程是并发完成的,所以同步到多个数据库和同步到一个数据库的时间基本相等;另外同步的过程是在事务的环境下完成的,保证了多份数据在任何时刻数据的一致性。

数据条数很少,数据内容也不大,则直接同步数据。数据条数很少,但是里面包含大数据类型,比如文本,二进制数据等,则先对数据进行压缩然后再同步,从而减少网络带宽的占用和传输所用的时间;

数据条数很多,此时中间件会拿到造成数据变化的SQL 语句,然后对SQL语句进行解析,分析其执行计划和执行成本,并选择是同步数据还是同步SQL 语句到其他的数据库中。此种情况应用在对表结构进行调整或者批量更改数据的时候非常有用。

优点

1、扩展性强:当系统要更高数据库处理速度时,只要简单地增加数据库服务器就可以得到扩展。

2、可维护性:当某节点发生故障时,系统会自动检测故障并转移故障节点的应用,保证数据库的持续工作。

3、安全性:因为数据会同步的多台服务器上,可以实现数据集的冗余,通过多份数据来保证安全性。

4、易用性:对应用来说完全透明,集群暴露出来的就是一个IP

缺点

1、不能够按照Web 服务器的处理能力分配负载。

2、负载均衡器(控制端)故障,会导致整个数据库系统瘫痪。

十一、MySQL日志

1、错误日志:记录启动,运行或者停止mysql 时出现的问题

2、通用日志:记录建立的客户端连接和执行的语句

3、二进制日志:记录所有更改数据的语句

4、慢查询日志:记录所有执行时间超过long_query_time 秒的的语句都会被记录。

以上是关于MySQL相关的主要内容,如果未能解决你的问题,请参考以下文章

mysql 性能优化相关

mysql 查看mysql相关信息

Mysql用户管理相关

Mysql用户管理相关

MySQL相关命令

mysql索引相关