Mysql优化方向:
1.存储层(数据):
构建良好的数据结构
2.设计层(单台服务器)
表结构的设计,表的引擎的选择,字段的索引的选择
3.架构层(多台服务器)
多台服务器协同工作的时候的一种架构!主从服务器,一主多从的实现!
主服务器,负责我们的写操作。从服务器就可以实现我们的读操作!
4.SQL语句层
写出一个继符合业务的,又能在性能上有所要求的SQL语句。
使用memcache redis等进行查询缓存,减少访问mysql次数,提高性能。
1.存储层:
合理的字段选择,会提升SQL语句查询的性能,也能节约我们的空间。空间节约了就会让IO 一次性读取数据量更大,提升性能。尽可能的不要将字段设置为null。
数据类型的选取:选择类型的时候,尽量是选择最小的类型,就能够把字段所有的范围包含进去的。
2.设计层:
①分区与分表:加快SQL语句的查询。
当表数据达到一定的数量级时。SQL语句的查询会非常的慢。
如何解决,需要把数据拆分到不同的表里面去。这个时候,就要使用分区或者是分表的技术
mysql服务器帮助实现的数据分区与分表功能 就是分区。分区的方式有很多,比如key分区,list分区,hash分区,range分区。
分表是程序员实现的自己拆表,把相同的数据存储到不同的表里。分表的方法有水平分表和垂直分表,水平分表可以减少每张表的数据量,垂直分表可以降低表的复杂度和字段的数目,从而达到优化目的。
②关于表的引擎的正确选择:
MyISAM适合于一些需要大量查询的应用,但是对于大量写操作的支持不是很好。甚至一个update语句就会进行锁表操作,这时读取这张表的所有进程都无法进行操作直至写操作完成。另外MyISAM对于SELECT COUNT(*)这类的计算是超快无比的。InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
MyISAM是MYSQL5.5版本以前默认的存储引擎,基于传统的ISAM类型,支持B-Tree,全文检索,但是不是事务安全的,而且不支持外键。不具有原子性。支持锁表。
InnoDB是事务型引擎,支持ACID事务(实现4种事务隔离机制)、回滚、崩溃恢复能力、行锁。以及提供与Oracle一致的不加锁的读取方式。InnoDB存储它的表和索引在一个表空间中,表空间可以包含多个文件。
两者主要区别:
myisam是支持表锁,innodb是支持行锁
myisam是不支持事务,innodb是支持事务的
myisam是支持地理空间索引,innodb是在5.6.2版本之上才支持
myisam是支持压缩的,innodb是不支持压缩
myisam是支持全文索引的,innodb是不支持全文索引
③字段的索引选择:
索引是排过序数据,索引会让我们在遍历的时候,少遍历很多数据,所以会加速我们的查询。为搜索字段建立索引。为每一张表建立主键id。
合理设计表的三种索引,可以大大提高查询效率,减少全表扫描情况的发生。
索引的选择:字段里面不重复的值的总数/字段值的总数>0.4原则。重复值太多的字段,就不适合做索引。
但是要注意,我们在使用范围查询的时候,要不要使用索引,不是我们决定的,还是我们的mysql服务器决定。它认为使用索引更快,就会使用索引。如果它认为使用索引不快,它就会快表扫描。
3.SQL语句层:
myisam表在使用统计的时候,直接使用count(*)就好了。因为我们myisam表的最后面有一个隐藏的值就是我们表的数量。你使用count(*)其实就是把这个值给取出来。
innodb表在使用统计的时候,直接使用count(字段名)就好了,各种说明都说的不适合使用*。但是个人测试数据量在200W的时候,使用*比字段名要快一些!!
4.架构层:
mysql服务器抗压能力有限,当并发数量较高时,可以实现主从服务器的架构来分担压力。
主服务器专门接受修改与写的请求,从服务器专门接受查询的请求。主服务器的数据变更时也会同步到从服务器,保证主从服务器的数据是相同的,实现读写分离。
网友评论