MySQL是一个关系型数据库管理系统,且也是最流行的关系型数据库管理系统之一,在日常开发WEB应用方面,MySQL是最好的数据管理应用软件之一。但是当我们的数据库存储的数据量庞大时,会造成应用程序读取数据库数据缓慢的现象,这大大降低了用户体验。接下来,笔者将带领大家看看如何优化我们的数据库,提高我们数据库的数据读取效率。
1、给自己数据表添加索引
数据表中索引相当于我们书本中的目录索引,每一条数据都对应着一个索引值。如果我们没有给数据表添加索引时,在大数据量下(百万条数据或者更多)精确查找某一条数据是通过一条一条来查找的,这样很耗服务器的cpu查找速度也慢;通过添加索引的后可以大大提高数据查找的速率。
创建普通索引:
CREATEINDEX索引名ON表名(列名)
创建唯一索引,它与上面的普通索引唯一不同的是,该索引不能重复也不能为空。
CREATEUNIQUEINDEX索引名ON表名(列名)
2、SELECT语句的优化
初学者使用Mysql时很喜欢使用select*from表名这样的语句,这样的语句增加很多不必要的服务器消耗(比如cpu的计算消耗、数据读取i/o的消耗),所以我们在使用select语句时根据自己的业务需求添加明确的查询字段,不查询额外的无意义的字段。除此之外我们查询数据时应该添加上查询条件,避免大面积对数据进行查询。
例如:selectname,age,email,phonefromuserswhereid=1;
3、避免使用外键
在设计表的时候使用外键进行约束两个表之间的数据关系,这样的设计给数据库的操作(增删查改)会带来压力的。比如我们在约束学生表和教师表之间的关系时可以使用额外的字段来约束两者之间的关系,可以给学生添加一个字段(teacher_id)来对两者之间的关系的约束。
4、当我们明确只需要一条数据时,可以使用limit1.
如:selectname,age,email,phonefromuserswhereid=1limit1;
5、in函数的值不能过多
在select语句使用in函数时,in函数里面的参数不能过多,否则也会造成慢查询,我们可以用between语句或者左右连接查询来代替。
6、ORDERBY排序的问题
ORDERBY查询数据排序时假如排序时的字段没有索引字段在里面,不要进行排序,因为这样也会造成cpu的额外消耗和慢查询。
7、where语句中null语句判断的问题
我们要避免在where语句中对字段进行null值判断,如果对null进行判断会导致mysql引擎放弃已经建立的索引查找方式而进行全表扫描,进行全表扫描在亿万条数据时可能导致服务崩溃。
8、unionall和union的使用问题
unionall和union之间的区别在于后者会将两表之间查询出来的数据进行唯一性的过滤,这样也会造成cpu的额外消耗,如果两个表之间的数据无重复的情况下,我们尽量使用unionall代替union,可以增加查询效率。
9、查询时分页的问题
在大数据量下使用分页查询也会导致查询速度越来越慢,比如:
selectname,phonefromuserslimit,20;
假如上面的语句时根据自增长的id进行分页的,我们可以把上述查询语句修改为:
selectname,phonefromuserswhereidlimit20;
10、关于模糊查询like的优化
我们在使用模糊查询时,尽量避免在查询字段前使用%,比如like“%name,这种查询方式也会导致mysql引擎放弃已经建立的索引查找方式而进行全表扫描,降低查询效率。
11、避免where语句中表达式的问题
在无特殊业务需求的情况下,我们应该避免在where语句使用表达式来对数据进行查询。
12、根据的业务选择适合的数据表引擎,常用的mysql引擎有myisam与innodb。如果你的表更新的少读取数据比较多可选用myisam作为该表引擎,否则则选用innodb引擎。
MySQL中myisam与innodb的区别如下:
关于mysql优化的方法笔者总结上面的12条,当然笔者的经验不够,更多的优化方式等待着我们一起探讨,如果您觉得这篇文章对您有帮助,请您多多