版权声明:版权由我个人所有,未经允许不得用于除学习外的其他用途,望周知。 https://blog.csdn.net/weixin_44515563/article/details/89735517
按照索引列进行排序
order by
1.增大sort_buffer-size(sort_buffer缓冲区)
2.提高max_length_for_sort_data
3.不要使用select *
mysql两种排序:文件排序或文件索引排序
mysql能为排序与查询使用相同的索引
group by
1.group by 实质是先排序后进行分组,遵照索引建的最佳左前缀原则。
2.当无法使用索引列,增大max_length_for_sort_data参考的设置,也可以增大sort_buffer_size的设置。
3.where高于having,能写在where限定的条件就不要去having限定了。(大道至简)
mysql慢查询日志是mysql提供的一种日志记录。
默认情况下,mysql数据库没有开启慢查询日志,需要我们手动来设置这个参数。
当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件。
show variables like '%slow_query_log%';
set global slow_query_log=1;
默认long_query_time的值为10秒;
show variables like 'long_query_time%';
假如运行时间正好等于long_query_time的情况,并不会被记录下来。也就是说在mysql底层源码里是判断大于long_query_time,而非大于等于。
set global long_query_time=3; #设置大于3秒为慢sql
重新打开一个窗口才生效,软件自身问题。
select sleep(4); 睡4秒
show global status like 'show_queries%';
检查系统中有多少条慢sql
锁是计算机协调多个进程或线程并发访问某一资源的机制。
在数据库中,除传统的计算资源(如CPU,RAM,I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个因素。从这个角度来说,锁对数据库而言是显得尤其重要,也更为复杂。
锁的分类:
1.从对数据库操作的类型(读/写);
{
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
写锁(排他锁):当前面写操作没有完成前,它会阻断其他写锁和读锁。
}
2.从对数据库操作的粒度分
{
表锁(多用于读)
行锁(多用于写)
页锁(不常用)
}
查询表的状态,是否有锁?0没有,其他有
show open tables;
show status like ‘table%’;
脏读: A读到B修改但未提交的数据
不可重复读:A读到了B已经提交的修改数据
幻读:A 读到了B插入的数据
如何锁定一行:
begin;
select * from test_innodb_lock where a=8 for update;
commit;
show status like 'innodb_row_lock%';
行锁优化建议
1.尽可能让所有数据检索都通过索引来完成,避免无索引,使行锁升级为表锁。
2.合理设计索引,尽可能缩小锁的范围。
3.尽可能较少检索条件,避免间隙锁。
4.尽可能控制事务的大小,减少锁定资源量和时间长度。
5.尽可能使用低级别的事务隔离级别