MySQL-性能优化

MySQL-性能优化

  • MySQL状态查询
  • 查询优化
    • 查询语句分析
  • 数据库结构优化
    • 将字段很多的表分解成多个表
    • 增加中间表
    • 增加冗余字段
    • 优化插入记录的速度
  • MySQL服务器优化
    • 优化服务器硬件
    • 优化MySQL配置参数
  • 数据库优化的思路
    • 1. FROM语句中的表名顺序
      • 原理
      • 应用
    • 2. WHERE语句的连接顺序
      • 原理
      • 应用
    • 3. 关于索引的查询优化
    • 4. 使用连接查询替代子查询
    • 5. SELECT语句避免使用"*"号
    • 6. 清空表数据时使用TRUNCATE代替DELETE
    • 7. 使用内置函数提高SQL效率
    • 8. 使用表或列的别名
    • 9. SQL关键字大写
    • 10. 避免在索引上使用NOT关键字
    • 11. 用>=代替>
    • 12. 用IN替代OR
    • 参考文档

MySQL状态查询

SHOW STATUS;							// 查询MySQL的所有状态信息

SHOW STATUS LIKE 'Connectioins';		// 查询MySQL服务器的连接次数
SHOW STATUS LIKE 'Slow_queries'			// 查询MySQL服务器的慢查询次数

查询优化

查询语句分析

// 使用EXPLAIN或DESCRIBE语句分析查询语句
EXPLAIN [EXTENDED] SELECT select_options
DESCRIBE SELECT select_options

// 使用EXPLAIN分析"SELECT * FROM fruits"语句的执行情况
EXPLAIN SELECT * FROM fruits

数据库结构优化

将字段很多的表分解成多个表

增加中间表

增加冗余字段

优化插入记录的速度

MySQL服务器优化

优化服务器硬件

  1. 配置较大的内存
  2. 配置高速磁盘系统,以减少读盘的等待时间,提高响应速度

优化MySQL配置参数

在修改MySQL服务器的配置参数之后,一定要重启MySQL。
MySQL服务的配置参数在 my.cnf 和 my.ini 文件的 [mysqld] 组中,MySQL服务器可优化参数如下:

  • key_buffer_size
  • table_cache
  • query_cache_size
  • sort_buffer_size
  • read_buffer_size
  • read_rnd_buffer_size
  • innodb_buffer_pool_size
  • max_connections
  • innodb_flush_log_trx_commit
  • back_log
  • interactive_timeout
  • sort_buffer_size
  • thread_cache_size
  • wait_timeout

数据库优化的思路

1. FROM语句中的表名顺序

原理

数据库的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表将被最先处理

应用

在FROM子句中包含多个表的情况下:

如果多个表是完全无关系的话:
	将记录最少的表放在最后,其他依次类推;
如果多个表是连接查询关系的话:
	将引用最多的表放在最后,其他依次类推;
// 例如:查询员工的编号,姓名,工资,工资等级,部门名时,emp表被引用得最多,记录数也是最多,因此放在from字句的最后面
select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.dname
from salgrade,dept,emp
where (emp.deptno = dept.deptno) and (emp.sal between salgrade.losal and salgrade.hisal) 

2. WHERE语句的连接顺序

原理

数据库解析器采用自右而左的顺序解析WHERE子句

应用

表之间的连接必须写在其他WHERE条件之左,那些可以过滤掉最大数量记录的条件必须写在WHERE子句之右。

// emp.sal可以过滤多条记录,写在WHERE字句的最右边
select emp.empno,emp.ename,emp.sal,dept.dname
from dept,emp
where (emp.deptno = dept.deptno) and (emp.sal > 1500) 

3. 关于索引的查询优化

  • 在使用like关键字进行查询的查询语句中,如果匹配字符串的第一个字符是"%", 则索引不会起作用;只有"%"不在第一个位置,索引才会起作用
  • 对于多列索引,只有查询条件中使用这些了字段中的第一个字段时,索引才会起作用
  • 查询语句的查询条件中使用OR关键字,并且OR前后的两个条件的列都是索引时,索引才会起作用

4. 使用连接查询替代子查询

原因:使用子查询会创建临时表,增加系统开销;而使用连接查询不会创建临时表,性能更好

5. SELECT语句避免使用"*"号

  • "*"可用于获取表中全部数据,但该操作是通过查询数据字典完成的,这意味着将耗费更多的时间
  • 使用"*"进行SQL查询不够直观

6. 清空表数据时使用TRUNCATE代替DELETE

  • DELETE一条一条删除记录
  • TRUNCATE直接将整个表删除,但保留表结构,效率更高

7. 使用内置函数提高SQL效率

例如使用mysql的concat()函数会比使用||来进行拼接快,因为concat()函数已经被mysql优化过了。

8. 使用表或列的别名

如果表或列的名称太长了,使用一些简短的别名也能稍微提高一些SQL的性能。毕竟要扫描的字符长度就变少了。。。

9. SQL关键字大写

我们在编写SQL 的时候,官方推荐的是使用大写来写关键字,因为Oracle服务器总是先将小写字母转成大写后,才执行

10. 避免在索引上使用NOT关键字

因为Oracle服务器遇到NOT后,他就会停止目前的工作,转而执行全表扫描

11. 用>=代替>

12. 用IN替代OR

参考文档

数据库面试题(开发者必看) 数据库优化的思路
《MySQL5.5从零开始学》第16章 性能优化

你可能感兴趣的:(MySQL)