mysql优化学习——01(引擎,索引,慢查询日志,profile分析)

本文详细介绍了MySQL优化的方法,包括外部缓存技术和内部优化措施。深入探讨了InnoDB、MyISAM和Memory三种存储引擎的特点及适用场景,并提供了索引创建、使用原则等方面的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

1.外部优化:
运用缓存技术,减少数据库的查询,如radis,memcache等
2.内部优化:
选用合适的存储引擎,innodb,myisam,memory等
数据表设计满足三范式
数据表字段选择合适的结构,varchar,int,text等
对常用的操作建立存储过程
sql语句优化
建立合适的索引
对于查询和写入频率差距大的数据库,建议读写分离

数据库引擎学习
Innodb
  1. 存储格式:

每个数据表有单独的“结构文件” *.frm;数据,索引集中存储于同一个表空间文件中ibdata1,这种行为可以通过配置‘innodb_file_per_table’这个变量来改变 set global innodb_file_per_table=1;

  1. 插入数据会进行默认排序,效率低 (会按主键进行排序)
  2. 并发性支持较好
  3. 对事务支持较好
  4. 行锁 (row-level-locking)与表锁均支持
  5. 数据备份与还原

不能直接备份,需要通过命令 mysqldump -u用户 -p密码 数据库名 > 备份文件路径名(如:d:/backup.sql)
还原操作:mysql -u用户 -p密码 数据库名 < 备份文件路径名

MyISAM
  1. 存储方式:

数据,索引,结构分别存储在不同的文件中。每个数据表都有三个文件 *.frm *.MYD *.MYI (表结构,数据文件,索引文件)

  1. 备份与还原:

数据文件支持物理复制,粘贴操作(直接备份还原)

  1. 表锁
  2. 对事务支持性不如innodb
  3. 所存即所得,插入时不会进行默认排序
Memory (内存存储引擎)

特点: 内部数据运行速度非常快,临时存储一些信息
缺点: 服务器如果断电或者重启,就会清空该存储引擎的全部信息
在这里插入图片描述在这里插入图片描述
重启后,数据消失
在这里插入图片描述

查找需要优化的语句
使用慢查询日志 (记录所有执行时间超过某个时间界限的sql语句)

在这里插入图片描述

方式一 临时启动慢查询记录日志
bin/mysqld --safe-mode --slow-query-log
在这里插入图片描述
测试:使用benchmark [select benchmark(10000000, 90000000*4)]
在这里插入图片描述
一般情况下,查询慢,是没加索引,添加索引 alter table 表名 add index(索引字段)
在这里插入图片描述
方式二 修改配置文件
log-slow-queries=‘e:/slow-log’
long_query_time=0.5

使用profile机制

开启 set profiling=1;
查看
在这里插入图片描述

索引讲解

利用关键字,建立与记录位置的一个对应关系。是独立于数据的一种特殊的数据关系。
类型:主键索引(primary key),唯一索引(unique key(字段)),普通索引(index(字段)),全文索引 (fulltext index(intro)),联合索引(index(字段1,字段2))
创建索引:
在这里插入图片描述
alter table text2 add index(name), add unique key(age), add fulltext index(intro);
alter table text1 drop index index_name;
去除主键索引时,如果主键id有auto_increment属性,则应当先删除该属性
alter table text modify id int not null;
查看索引
show indexes from table
在这里插入图片描述
创建索引注意事项

  1. 较频繁的作为查询条件的字段应该创建索引
  2. 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
  3. 更新非常频繁的字段不适合创建索引
  4. 不会出现在WHERE子句中的字段不该创建索引
索引的数据结构

1.myisam的存储引擎索引结构
索引的节点中存储的是数据的物理地址(磁道和扇区)
2.innodb的存储引擎的索引结构
innodb的主键索引文件上,直接存放该行数据,称为聚簇索引,非主键索引指向对主键的引用(非主键索引的节点存储的是主键的id)

索引覆盖

就是说如果查询的列恰好是索引的一部分,那么查询只需要在索引区上进行,不需要到数据区再找数据,这种查询速度非常快。
负面影响,增加了索引的尺寸;
在这里插入图片描述

索引的使用原则

1.列独立性原则:索引字段在=号左右单独存在 如 where age-1 = 10; 就违背了列独立性原则,不会使用到索引
2.like查询时, 以%开头的like查询不会使用到索引
在这里插入图片描述
%在右边时,会使用到索引
在这里插入图片描述
3. or 运算 需要or两边的字段都具有索引,才会使用到索引
在这里插入图片描述
而当使用id与name时,因为两个字段都有索引,所以在查询中使用了索引
在这里插入图片描述
4.复合索引 当查询时,使用了最左边的字段是,就会使用到索引,for example:
test1表中有复合索引index(name,age), name在最左边,当只使用age来查询时
在这里插入图片描述
当使用name来查询时,使用到了索引
在这里插入图片描述
注:在多列查询中,如果有多个查询条件,要想查询效率比较高, 要保证最左边的列用到索引
mysql会智能选择,如果使用索引会比实地查询慢,则mysql会放弃使用索引。
5. 优化group by语句
mysql默认会对group by查询结果排序
在这里插入图片描述
这会增加开销,如不想让其排序,在语句后加order by null;
在这里插入图片描述

执行计划 【查看索引的使用情况】

explain sql语句 \G (行列转换)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值