优化mysql数据库是作为一名DBA必备的学习技能。其实这里所说的优化mysql主要说的是对查询进行优化。这块就强调了索引对查询的重要性了,当然如果表中的数据很少那么加不加索引来进行查询你可能感觉不出来(如果你在创建表的时候没有设置主键,则会自动生成一个6字节的ROWID并以此为主键),那我们来用一些技术语句来说明这一切。
首先我们先来创建一张表,把他的id这位主键(也就是这张表idea唯一索引),截图如下:
现在往里面插入几条数据,以便后面的查询需要,截图 如下:
现在我们先不使用索引来查询,explain select * from user where name="lisi",截图如下:
可以看到rows=3,而表中就恰好有三条数据,其实是这样实现的:通过where name="lisi"这个条件去整张表去查找,就相当于把整张表给扫描了一遍,即使你查的数据不在整张表的最后一条,它也会把整张表给扫描一遍,因为不敢保证后面还有没有也叫“lisi”的人,所以这样查询效率就会很慢。
如果使用索引来查,效率就会大幅度的提高,explain select * from user where id=2,截图如下:
可以看到rows=1,明显比上面的查询效率高了好几倍呢。他的底层实现原理是这样的,其实整张表的索引也是有它的id,通过where id=1这个条件先扫面索引的id,通过找到索引的id来找到整条数据,降低了mysql服务器的开销。
接下来要说的就是使用like关键字来优化缩印查询。应用like关键字,并且匹配字符串中含有百分号“%”符号。
首先先在name字段创建一个名为index_name的索引,create index index_name on user(name),截图如下:
如果我们通过like关键字在查询的时候把”%“放到了前面,就起不到优化查询的效果,截图如下:
首先我想查询name="lisi"的人,而lisi特有的字符是”l“,所以我的查询条件是where name like '%l';但是rows=3,并没有起到优化作用,这是因为如果匹配字符串中,第一个字符为百分号“%”时,缩印则不会被使用,
接下来我们把“%”所匹配的字符串的位置放到不是第一个的位置,看看结果,截图如下:
这里rows=1;这是因为如果“%”所匹配的字符串的位置如果不在第一个位置,则索引会被正常使用。
接下来说的是使用多列索引,提高字符串匹配的精度,提高查询优化,首先先创建一个多列索引,create index index_user on user(name,text),截图如下:
这个时候再去查询。explain select * from user where name="zhangsan" or text="haha",就会发现rows=1。在mysql中,查询语句只有包含or关键字,要求查询的两个字段必须同为索引,如果所搜查的条件中,有一个条件不为索引,则在查询中不会应用索引进行查询。
接下来说一下优化插入。
在插入数据时,mysql会根据表的索引对插入的数据进行排序,如果插入大量的数据时,这些排序会降低插入的速度,所以在插入之前先禁用索引,等到插入完毕之后再重新开启索引,禁用索引alter table 表明 disable keys,截图如下:
在插入数据的时候有两种方式,第一种是插入多条数据,截图如下:
第二种是每次插入一条语句,多插入几次,截图如下:
显然第一种插入方式减少了与数据库之间的连接操作,其速度比第二种插入方式要快。
插入完毕之后,在重新开启索引,截图如下:
接下来说一下查询高速缓存。其实在msyql中,用户通过select语句查询数据时,该操作将结果集保存在一个特殊的高级缓存中,从而实现了查询操作。首次实现查询后,当用户再做相同的查询操作时,mysql即从高速缓存中检索结果,这样一来,既提高了查询效率,同样起到了优化查询的作用。
使用show variables like '%query_cache';来查询高速缓存是否开启,截图如下:
可以看出have_query_cache对应的时yes。其表示查询高速缓存已经配置好。
注释:经常运行查询高速缓存,将会提高mysql数据库性能。
最后说一下优化表的设计:首先在设计数据库表时候就应该优先考虑使用特定字段长度,后考虑使用变长字段。如果在用户创建数据表时,考虑创建某个字段类型为varchar而设置其字段长度为255,但是在实际应用上时,该用户所存储的数据根本达不到该字段所设置的最大长度,命令外如设置用户性别的字段,往往可以用“M”表示男性,
“F”表示女性,如果给该字段设置长度为varchar(50),则该字段占用了过多的列宽,这样不仅浪费资源,也会降低表的查询效率。适当调整列宽不仅可以减少磁盘空间,同时也可以使数据在进行处理时产生的I/O减少,将字段长度设置成其可能应用的最大范围可以充分的优化查询效率。
改善性能的另一项技术是使用optimize table命令处理用户经常操作的表,频繁的操作数据库中的特定的特定的表会导致磁盘碎片的增加,这样会降低mysql的效率,故可以用该命令处理经常操作的数据表,以便于优化访问查询效率。