mysql 优化杂谈

作者: 分类: php 时间: 2022-04-30 评论: 暂无评论

依据:
sql查询的时间主要是: 磁盘寻址,磁盘读取。
数据库服务器同时使用顺序IO和随机IO。随机IO受益于缓存。顺序IO非常快,是随机IO的好几个量级,不需要缓存。
一个随机读一般意味着存储引擎必须执行索引操作。比如B树。顺序读一般是遍历简单数据结构,比如链表

顺序I/O :指的是本次 I/O 给出的初始扇区地址和上一次 I/O 的结束扇区地址是完全连续或者相隔不多的。反之,如果相差很大,则算作一次随机 I/O。

而发生随机I/O可能是因为磁盘碎片导致磁盘空间不连续,或者当前block空间小于文件大小导致的。

顺序 I/O 比随机 I/O 效率高的原因是:在做顺序 I/O 的时候,磁头几乎不用换道,或者换道的时间很短;而对于随机 I/O,如果这个 I/O 很多的话,会导致磁头不停地换道,造成效率的极大降低。

索引将随机IO变成顺序IO

聚蔟索引
一个表只能有一个聚蔟索引,基本是主键id,速度最快。
覆盖索引
在sex建立索引
explan selet sex from user where sex=0; # using index 就是覆盖索引。相当于说使用索引获得数据,不需要再查找数据行。这个方式跟B+树的叶子节点存储索引值有关系。

小技巧
1.适当添加索引,一个表的索引数最好不要超过6个(影响插入 更新 新增性能)

2.数据结构尽量使用固定长度,尽量使用整数类型,长度固定(数据库长度是一定的,但是内存分配确是按照字段长度定义)

3.不要在sql进行计算

4.不要在where 子句中使用 != 或 <> 操作符(全表查询),用 > or <代替

5.尽可能给默认值,不用留null(导致全表)

6.避免使用模糊查询(用 like key%代替 或者Elasticsearch )

select * from message_1 where content in
(select content from message_1 where content like "%今天不开心%");

7.开启慢查询,explan 分析sql

8.大表先分页 在join

  1. 在用到group by时,即使你不需要排序,MySQL会默认根据分组字段order by。

考虑一下order by null:

explain select * from record group by create_at order by null

可以看到外部排序没有了。也可以使用 加索引的

  1. 临时表
    有这样需求,有一张每天ip访问的记录表,要统计每天的ip唤起,可以考虑创建一张每天的统计表。

insert into record_day SELECT COUNT(*) as num,FROM_UNIXTIME(time,'%Y-%m-%d') as date FROM record GROUP BY FROM_UNIXTIME(time,'%Y-%m-%d')

11.索引最左原则,利用组合索引可以对or语句优化。组合索引很好用

mysql 【innodb】隔离级别测试

作者: 分类: mysql 时间: 2022-04-28 评论: 暂无评论

在mysql设计一个张表event,引擎是innodb,开启2个控制台,按照 t1 t2 t3 t4 t5 t6 顺序执行

id  num
1   18

开启控制台1

begin;  
select num from event where id=1;   //t1
select num from event where id=1;   //t4 
select num from event where id=1;   //t6

开启控制台2

begin; 
update event set num=20 where id=1  //t2
select num from event where id=1;   //t3
commit                              //t5

【可重复读】结果:18 20 20 18
【不可重复读】结果:18 20 20 18

观察得出结论:
【可重复读】(mysql默认隔离级别)
事务开始后不被其它【已提交】【未提交】的SQL 影响
单个事务中,修改值影响后面操作

【不可重复读】
事务开始后不被【未提交】的SQL影响,会被【已提交】的SQL影响
单个事务中,修改值影响后面操作

【补充】
mysql查看当前的隔离级别

show variables like 'transaction_isolation';

mysql设置隔离级别

set session/global transaction isolation level read uncommitted | read committed | repeatable read | serializable ;

进程和线程,并发和并行

作者: 分类: php 时间: 2022-04-12 评论: 暂无评论

进程和线程

A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。
B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
C.一个进程可以创建和撤销多个线程;同一个进程中的多个线程之间可以并发执行。

并发和并行

A. 多线程程序在一个核的cpu上运行,就是并发。
B. 多线程程序在多个核的cpu上运行,就是并行。

协程和线程

协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。
线程:一个线程上可以跑多个协程,协程是轻量级的线程。