一.数据库表结构结构的设计
- 能够用数字类型的字段尽量选择数字类型而不用字符串类型的(比如电话号码),这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
- 对于字符类型的选择。char查询快,但是耗存储空间,varchar查询相对慢一些但是节省存储空间。在设计字段的时候可以灵活选择,例如用户名、密码等长度变化不大的字段可以选择CHAR,对于评论等长度变化大的字段可以选择VARCHAR。
- 字段的长度在最大限度的满足可能的需要的前提下,应该尽可能的设得短一些,这样可以提高查询的效率,而且在建立索引的时候也可以减少资源的消耗
二.查询的优化
- 保证在实现功能的基础上,尽量减少对数据库的访问次数
- 通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担
- 不要使用SELECT * FROM T1。要用到几列就选择几列如:SELECT COL1,COL2 FROM T1;
- 尽量将多条SQL语句压缩到一句SQL中。每次执行SQL的时候都要建立网络连接、进行权限校验、进行SQL语句的查询优化、发送执行结果,这个过程是非常耗时的,因此应该尽量避免过多的执行SQL语句,能够压缩到一句SQL执行的语句就不要用多条来执行
- 在in和exists中通常情况下使用EXISTS,因为in不走索引
索引:
不管何种调优方式,索引是最根本的方法,是一切优化手法的内功。创建索引给检索带来的性能提升往往是巨大的,因此在发现检索速度过慢的时候应该首先想到的就是创建索引
- 在经常需要进行检索的字段上创建索引,比如要按照姓名进行检索,那么就应该在姓名字段上创建索引
- 经常需要进行检索的字段:
作为主键的列上
经常需要排序的列上
经常使用在where子句上面的列上 - 避免在索引上使用计算
在where字句中,如果索引列是计算或者函数的一部分,DBMS的优化器将不会使用索引而使用全表查询
效率低:select * from person where salary*12>25000(salary是索引列)
效率高:select * from person where salary>25000/12(salary是索引列) - 什么时候索引会失效:
条件中用or
like的模糊查询以%开头
如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引