0%

PriorityQueue详解

PriorityQueue是优先级队列,底层使用数组存储,是基于二叉堆的一个无界队列,可以使用默认排序或者提供Comparator比较器使得队列中的元素有序,入栈出栈的时间复杂度是O(logn)

阅读全文 »

优化建议

数据库中最大的性能瓶颈就是磁盘io,主要体现在读写前寻找磁道的过程中;另一个影响性能因素是内存,innodb在内存中开辟了一个Buffer_Pool缓冲池,然后把数据页和索引页都放在内存缓冲池中读写,影响缓冲池的参数是innodb_buffer_pool_size,如果仅有innodb存储引擎的数据库服务器上,可以设置为60%的内存

对于同一份数据,当我们使用不同的方式去寻找其中的内容时,所需要读取的数据量可能是天壤之别,所消耗的资源相差也很大

join语句优化

  • 使用小表驱动大表(小结果集驱动大结果集),减少join语句的nestedLoop的循环总数

    如 select * from admin left join log on log.admin_id = admin.id where log.admin_id > 10

    就应该改为

    select from (select from admin where id > 10) t1 left join log on log.admin_id = t1.id

    使得左表尽可能的小

  • 优先优化内层循环,内层循环是执行次数最多的

  • 保证join语句中被驱动表上的join条件已被索引

  • 尽量用join代替子查询

  • join buffer的大小对整个join语句的消耗起到关键的作用

阅读全文 »

SQL优化

SQL的优化并不是一开始就进行优化的,而是需要先进行观察的,所以SQL优化的步骤应该是这样的

步骤

  • 定位优化对象的性能瓶颈

    首先要判断出这个Query的瓶颈到底是IO还是CPU,可以使用profiling功能来找到Query的瓶颈

  • 明确的优化目标

  • 慢查询的开启与捕获

  • explain+慢SQL分析

  • show profile查询SQL在MySQL服务器里的执行细节和生命周期情况

    已经废弃,使用performance_schema代替

  • 进行MySQL的参数调整优化

阅读全文 »

show profile调优

有时候使用explain执行计划发现其实是命中了索引的,但是还是很慢,此时可以使用profile功能,show profile是mysql提供的可以用来分析当前会话中语句执行的资源消耗情况,如CPU、IO、IPC、SWAP以及发生的PAGE FAULTS等,可以用于SQL调优的测量

配置

默认情况下是关闭的

1
2
3
4
5
6
7
8
9
10
11
12
mysql> show variables like '%profiling%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| have_profiling | YES |
| profiling | OFF |
| profiling_history_size | 15 |
+------------------------+-------+

have_profiling 表示当前mysql版本支持show profile功能
profiling 表示当前功能是否开启
profiling_history_size 表示可以保留的历史数量(sql条数)
阅读全文 »

慢查询日志

MySQL的慢查询日志是用来记录MySQL响应时间超过阈值的语句,即为超过long_query_time值得sql语句

默认没有开启慢查询(如果开启慢查询会导致性能降低)

慢日志配置

查看是否开启慢查询

1
show variables like '%slow_query_log%';

开启慢查询

1
2
--只对当前数据库生效,如果重启则失效
set global slow_query_log = 1;

查看慢查询日志文件位置

1
show variables like '%slow_query_log_file%';

如果需要永久生效,在需要在my.cnf配置文件中配置

在[mysqld]下添加slow_query_logslow_query_log_file参数,然后重启服务器即可

阅读全文 »