影响Mysql性能的几大因素
- 硬件条件
- 操作系统
- 存储引擎选择
- 数据库参数配置
- 数据库表结构设计和SQL语句
Mysql体系结构
Mysql存储引擎
-
MyISAM存储引擎:没有事务,外键,访问速度快,对表增删改操作不多的时候建议使用。(数据安全性不高)
-
InnoDB存储引擎:Mysql5.5之后的默认引擎,使用最多,支持事务,列的自增,支持外键。(数据写入效率不高)
-
MEMORY存储引擎:内存中建表,服务关闭数据消失,读写速度非常的快,默认使用HASH索引。
-
MERGE存储引擎:Merge引擎将一定数量的MyISAM表联合而成一个整体,且这些MyISAM表结构必须完全相同。如对每个月的日志表整合,用于生成一年的报表。
-
CSV:以CSV格式进行存储,所有列必须都是不能为空,不支持索引,不适合大表,不适合在线处理,可以对数据文件直接编辑
-
ARCHIVE :不支持索引,查询效率低,数据压缩比非常高,大概只有InnoDB的1/10-15,插入快,多用于数据归档
-
PERFORMANCE_SCHEMA :主要用于收集数据库性能参数。提供进程等待的详细信息,包括锁、互斥变量、文件信息;保存历史的事件汇总信息,为提供MySQL服务器性能做出详细的判断;对于新增和删除监控事件点都非常容易,并可以随意改变mysql服务器的监控周期
-
BLACKHOLE(黑洞引擎) :该存储引擎支持事务,而且支持mvcc的行级锁,写入这种引擎表中的任何数据都会消失,主要用于做日志记录或同步归档的中继存储,这个存储引擎除非有特别目的,否则不适合使用。
MySql索引类型
Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。
-
FULLTEXT
即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。
-
HASH
由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。
HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。
-
BTREE
BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。 -
RTREE
RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
数据库参数设置
思路:其实参数配置无非就是从,连接数,连接时间,闲置时间,和缓存等方面来进行优化,参数配置的前提条件要和我们服务器配置相匹配,好比你开着兰博基尼去跑山上的泥巴路?
参考:MySQL性能优化之参数配置
数据库表结构设计和SQL语句
- 使用查询缓存优化查询
- 使用EXPLAIN关键字检测查询
- 当只要一行数据时使用LIMIT 1
- 为搜索字段建立索引
- 在join表的时候使用相当类型的列,并将其索引
- 切记不要使用ORDER BY RAND()
- 避免使用SELECT *
- 永远为每张表设置一个ID主键
- 使用ENUM而不是VARCHAR
- 尽可能的不要赋值为NULL
- 固定长度的表会更快
- 垂直分割
- 拆分大的DELETE或INSERT
- 越小的列会越快
- 选择正确的存储引擎
- 小心永久链接
参考:https://blog.youkuaiyun.com/u013087513/article/details/77899412