PHP经典面试题——数据库优化

Mysql数据库优化

        PHP学习过程中或者面试过程中少不了的一个重要知识点,那就是关于数据库的优化问题,本人经过查阅资料并验证,总结了几点比较浅层的数据库优化方法,小白可以参考,大神勿喷。

        忘了什么时候发现的一张关于Mysql数据库优化的梯形图了,一直收藏着,感觉很有道理:

PHP经典面试题——数据库优化

        从图中可以很明显的看出Mysql数据库优化的常用方法以及成本的高低。sql语句的优化和索引的优化是成本最小但是效果最好的方法,关于这两点我总结了如下几个优化方法:

        1.sql语句中不使用子查询,比如delete from user where uid not in( select id from order),因为使用子查询数据库要在内存中建立临时表,消耗资源,如果两个表有关联并且经常被一块调用,最好是在一张表中建立另一张表的外键用join语句查询,比如:delete from user left join order on user.id=order.uid;

        2.sql语句中最好不要出现*来代替已知字段,即使是要查询所有字段也要写出每一个字段,因为用*代替字段数据库要先查询出表中有哪些字段再进行sql语句的查询,无形中又多了一次无意义的查询工作;

        3.建立索引

                3.1索引可以非常大程度加快数据库检索速度,尤其是在where和join中出现的列或者用Order by排序的时候速度更是快很多(需要判断或者比较或者排序的时候);

                3.2索引大类分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇  索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快;

                3.3但是建立索引并不是越多越好,过多索引会造成冗余,因为每一次delete、update、add都会刷新一次索引,过多索引造成其他操作消耗过多资源,过小的表也没必要建立索引,没人见过两页的宣传单页还有目录的对吧。

        第二重要的就是表结构优化,关于这方面也有以下几点简单总结:

        1. 选择最合适的字段属性,使用可以存在数据的最小的数据类型,例如邮政编码,手机号码这类定长的数字可以用char(6),char(11);性别或者是否这种判断性文字可以用tinyint;字段属性尽量为not null这样不用判断是否为空,减少一个步骤(用其他方式表达你想表达的NULL,比如 -1);如果一定要用text这种类型,最好是采用分表存储;

        2.将常用信息和不常用信息分表存储,比如一个商城网站的用户表,用户的昵称,头像,密码,账号这类字段用户登录就会用到,而用户的兴趣爱好了,喜欢的颜色了这种字段就分表存储,相信大家京东账号中的个人信息可能也就在注册的时候打开过,以后就再没注意过了吧。


    其它关于分库分表,负载均衡了集群和分布式了本小白还没接触过,需要的同学查阅其它资料哈!