PriorityQueue详解
PriorityQueue是优先级队列,底层使用数组存储,是基于二叉堆的一个无界队列,可以使用默认排序或者提供Comparator比较器使得队列中的元素有序,入栈出栈的时间复杂度是O(logn)
数据库中最大的性能瓶颈就是磁盘io,主要体现在读写前寻找磁道的过程中;另一个影响性能因素是内存,innodb在内存中开辟了一个Buffer_Pool缓冲池,然后把数据页和索引页都放在内存缓冲池中读写,影响缓冲池的参数是innodb_buffer_pool_size,如果仅有innodb存储引擎的数据库服务器上,可以设置为60%的内存
对于同一份数据,当我们使用不同的方式去寻找其中的内容时,所需要读取的数据量可能是天壤之别,所消耗的资源相差也很大
使用小表驱动大表(小结果集驱动大结果集),减少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语句的消耗起到关键的作用
有时候使用explain执行计划发现其实是命中了索引的,但是还是很慢,此时可以使用profile功能,show profile是mysql提供的可以用来分析当前会话中语句执行的资源消耗情况,如CPU、IO、IPC、SWAP以及发生的PAGE FAULTS等,可以用于SQL调优的测量
默认情况下是关闭的
1 | mysql> show variables like '%profiling%'; |
MySQL的慢查询日志是用来记录MySQL响应时间超过阈值的语句,即为超过long_query_time值得sql语句
默认没有开启慢查询(如果开启慢查询会导致性能降低)
查看是否开启慢查询
1 | show variables like '%slow_query_log%'; |
开启慢查询
1 | --只对当前数据库生效,如果重启则失效 |
查看慢查询日志文件位置
1 | show variables like '%slow_query_log_file%'; |
如果需要永久生效,在需要在my.cnf配置文件中配置
在[mysqld]下添加
slow_query_log
和slow_query_log_file
参数,然后重启服务器即可