一、数据库设计方面
-
选取最合适的字段属性
关系型数据库虽然支持大数据量的存取,但是一般来说都是表越小,执行速度越快。因此在满足业务需求时,尽可能的将字段宽度设置小一点。 -
避免使用NULL字段,很难查询优化且占用额外索引空间。
-
数据库索引
索引是提高数据库性能的最常用方法。通常情况下索引应该建立在那些用于join连接,where判断,orderby排序字段上。尽量不要在对数据库中某个含有大量重复值的字段建立索引。如用户表中的性别字段就不适合创建。
如:用户表中的性别字段就不适合创建索引(因为性别只有男或女两个值),在这样的字段上创建索引不仅不会提高数据库查询的效率,反而有可能降低数据库的性能。索引并不是越多越好,索引固然可以提高相应的select的效率,但同时也降低了insert及update的效率,因为INSERT或UPDATE 时有会更新索引,所以怎样建索引需要慎重考虑。
二、SQL语句优化篇
-
尽量避免使用子查询,可以使用JOIN链接查询替代
常用的关系型数据库都支持子查询,子查询使用SELECT语句创建一个查询结果,然后把这个结果作为一张临时表用在另一个查询中。使用子查询可以一次完成多步SQL操作,也可以避免事务或者表锁死,且写起来比较容易。但是使用子查询MYSQL会在内存中创建一张临时表供外层查询使用,所以会降低查询的效率。这时候我们可以使用JOIN链接操作来替代子查询。如:假设我们要将所有没有订单记录的用户取出来,可以用下面这个查询完成:
SELECT *
FROM customerinfo
WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )如果使用连接(JOIN)… 来完成这个查询工作,速度将会快很多。尤其是当salesinfo表中对CustomerID建有索引的话,性能将会更好,查询如下:
SELECT *
FROM customerinfo LEFT JOIN salesinfo
ON customerinfo.CustomerID=salesinfo.CustomerID
WHERE salesinfo.CustomerID IS NULL连接(JOIN)… 之所以更有效率一些,是因为 MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作
-
不建议使用select * from t ,用具体的字段代替“*”,不要返回用不到的任何字段。尽量避免向客户端返回大量数据。
-
select count(*)from t ;这样不带任何条件的count会引起全表扫描。
-
尽量不要在where子句中对字段进行null判断,否则将导致引擎放弃使用索引而进行全表扫描。可以对null值设置默认值0.
-
尽量避免在where子句中使用or来连接条件,如果一个字段有索引,一个字段没索引,将导致引擎放弃使用索引而进行全表扫描。
如:select id from t where num=10 or Name = ‘admin’
可以这样查询: (使用union或者union all)
select id from t where num = 10
union all
select id from t where Name = ‘admin’
而且:UNION All能满足业务需求不要使用UNION
UNION会自动压缩多个结果集合中的重复结果,而UNION ALL 则将所有的结果全部显示出来,不管是不是重复。所以当UNION ALL能满足业务需求的时候,尽量使用UNION ALL而不用UNION。前者比后者快很多。 -
避免在索引上使用计算:
where age + 1 = 10,任何对索引的操作都将导致表扫描,它包括数据库教程函数、计算表达式等 -
一般情况下不建议使用like操作,特别是数据量比较大的表
like ‘%张%’ : 不会使用索引
like ‘张%’ : 使用索引
三、使用数据库连接池
使用数据库连接池的好处就不用多说了吧,能够避免长时间对数据库建立连接和关闭带来的损耗。