mysql数据库操作(十五)

版权声明:版权由我个人所有,未经允许不得用于除学习外的其他用途,望周知。 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.尽可能使用低级别的事务隔离级别

猜你喜欢

转载自blog.csdn.net/weixin_44515563/article/details/89735517
今日推荐