爱学it学无止境
,对数据库进行性能调优就非常的重要,也是确保应用程序高效运行的关键一环。
Mysql是一款广泛应用于各种规模和类型的应用程序的关系型数据库管理系统。在实际数据库应用中,我们常常面临这各种性能瓶颈和问题,据不完全统计,
性能测试过程中发现的性能瓶颈有70%以上的都是来自于数据库;而且当数据库的性能遭遇瓶颈的时候,应用程序的响应时间会延长,TPS会降低,甚至严重
的时候会导致系统崩溃和宕机。
所以,对数据库进行性能调优就非常的重要,也是确保应用程序高效运行的关键一环。
那么,数据库的性能瓶颈可能表现在哪些方面呢?主要总结如下:
1、数据库查询性能低下:某些查询语句执行速度缓慢,导致应用程序的响应时间变慢,用户体验下降;
2、并发访问问题:当多个用户同时访问数据库时,可能会出现锁竞争、死锁等问题,从而导致系统性能下降;
3、数据库配置不当:Mysql的默认配置可能无法满足特定应用程序的需求,需要对参数进行释放的调整,比如数据库最大连接数等配置,可以获得更好的性能;
4、数据库存储引擎选择:不同的引擎具有不同的性能特点,选择合适的引擎也至关重要。
5、数据库的设计不合理:比如业务表数据过于庞大,没有进行分表分库,导致数据查询更新都很慢。
面对这些问题,我们需要对数据库采取一系列的调优措施,以提升Mysql数据库的性能和用户体验。我们今天主要给大家讲一下平时用的最多的索引调优。
索引概念
索引是一种数据结构,用于帮助我们在大量数据中快速定位我们要查找的数据,主要作用是加快我们查找数据的速度,类似于汉语字典和书籍目录。
大家有环境可以拿自己的项目试一下,加了索引和没有加索引的sql语句的执行速度。
这条语句的执行速度是0.02s,因为id是主键索引;
这条SQL的执行速度是0.118s,同一个库和表,慢出一个数量级,因为mobile字段不是索引。
SELECT * FROM cb_account where id = 182037;
SELECT * FROM cb_account where mobile= '13525329369';`
给这张表的mobile字段加一个索引,然后再查询:
同一个sql语句速度立马提升到0.020s
SELECT * FROM cb_account where mobile= '13525329369';
通过以上的简单的案例演示,我们发现索引确实可以很大程度的提高查询的速度,特别是数据量比较大的时候,这种速度提升的效果就尤其明显。
索引分类
索引主要的类型有如下几种:
一张表,可以没有主键;如果有主键,主键这一列的值,一定是唯一,不重复,不存在‘空’
创建主键索引的方法:create index 索引名 on 表名(字段);
创建主键索引的语法:create unique index 索引名 on 表名(字段);
创建主键索引的语法:create index 索引名 on 表名(字段1,字段2,......);
主键索引 primary key :也叫做单值索引,如果一张表创建了主键,就默认会生成一个主键索引,不用再额外创建。
唯一索引(unique index):不可重复,但是可以存储NULL
复合索引,也叫做组合索引:由表的多列按顺序组合成为索引;使用时,按照组合顺序使用索引,也可以使用组合索引中部分索引字段。
创建索引的原则
索引虽然可以大大的提升数据库的查询的性能,但是也不能盲目加索引,因为索引有一定大小,会占磁盘\内存空间。
创建索引,其实本质上就是使用空间换时间,以磁盘和内存的空间来换取查询时间更少;如果索引创建很多和很复杂,那么就会占用大量的内存空间,
性能损耗就会很大;所以我们需要正确加索引,在空间和时间上取最佳平衡点。
我们创建索引的时候要遵循如下原则:
可以创建索引的列:
1、主键列可以创建索引,外键列用于表关联和链接查询的条件, 也可以用于创建索引
2、频繁查询的数据列可以用于创建索引
3、频繁用在where语句中的列可以创建索引
不应该创建索引的列:
表修改操作远频繁于查询操作时 :因为修改表是需要修改索引的,所以维护索引成本比用索引的成本高了;
数据很少的列,比如type字段只有0和1两个值,提升不明显;
查询很少用到的列,或者经常会变化列值的 【类型会变化的列】
如何正确的使用索引
索引的最左前缀规则
当索引类型为复合索引的时候,我们要遵循组合索引的“最左前缀”规则,否则使用就会失效,无法达到提高查询效率的目的。
比如创建组合索引(c1,c2,c3),实际包含三个索引(c1),(c1,c2),(c1,c2,c3),索引里必须有一个最左边的字段。必须要按照这个索引来使用
才是会正确使用索引,否则就不会使用索引。
我们建索引的时候,使用的列,只要列的名称,与表列的顺序没有关系,因为表中的列是没有顺序的,
我们做个小练习:如果在表里有如下字段,我们创建一个复合索引:
如上组合索引,就相当于加了3个索引:
mobile
mobile,email
mobile,email,gqid
我们的SQL语句就需要按照如上三个索引去查询,才会使用索引提高速度,所以要正确的使用索引。我们做个判断练习,以下SQL语句哪些会使用索引,哪些不会使用索引?