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语句优化。组合索引很好用

标签: none

订阅本站(RSS)