- 选取合适的字段属性
-
这其中包括最长用到的char和varchar的问题。过长的字段长度会给数据库带来压力。其中数值类型比字符类型处理速度更快,索引能用数值型和ENUM实现的就不要用字符类型。(为什么?因为数据值类型处理很快,字符类型存在字符匹配,这是个耗时的过程)
-
尽量将字段设置为not null ,数据库比较时将不考虑null值。并且索引列为null值时,将使索引失效。(为什么? 因为不考虑null的数据将减少读磁盘的次数,读磁盘是很耗时的过程。)
-
使用JOIN来代替子查询
子查询是先查外表再到内表,如果外表数据量很大,这样速度会明显的下降,JOIN是经过优化的查询,(为什么?是因为MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作,一般外表数据量要选小的,内表数据量大写)。 -
使用联合(UNION)来代替手动创建的临时表
(为什么? UNION会自动创建多条语句的临时表来完成查询任务,并且在查询任务执行完毕后,自动删除临时表。注意的是:每条查询语句的字段数量要一致。) -
事务
事务是操作数据库再熟不过的了,为了防止数据不一致性,在多线程,多sql语句情况下最好使用事务来保证某一个操作是原子操作。(为什么?防止数据不一致性最有效的方法就是让整个业务流程变成原子操作,事务能解决这个问题) -
表锁定
开始事务是会消耗数据库性能,事务锁定的是数据库,相当于一个事务期间,其他用户是不能访问数据库。毫无疑问,这个锁的粒度还是很大的,表锁定是比事务粒度更小的锁,在多订状态,只有这个表不能被其他用户访问,而不是整个数据库。 -
外键
外键确实能够确保数据的一致性,如果两个表相连,但是其中有一个表的一条记录被删除,那么相连的表与删除的那条记录依赖的记录也应该被删除,晚间可以保证 -
索引
- 索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。
- 建索引是一门技术活,需要好好学习一下。
- sql语句优化
- sql语句优化与开发人员密切相关,具备sql优化能力也是必备的素质
sql语句优化方案
-
最好是在相同类型的字段间进行比较的操作。(为什么?)
-
在建有索引的字段上尽量不要使用函数进行操作。(为什么?)
这样会让索引失效,但是为什么会让索引失效呢?
我的理解是,索引是实际值按照规则的映射关系,拿到的是映射关系的值,如果要对实际值进行函数操作,索引是做不到的,这要通过全表查询,得到实际值才能实现。 -
在编写sql语句时要有一个思想,需要什么就查什么,不要返回多余的数据。要用WHERE限制返回数据。(这一点是思想问题)
-
尽量不要是用not null , null, <>/!=之类的判断
-
如果是某列是顺序的,可以用between and 代替 范围查询
-
查询是尽量进行分页查询,用limit 来限制,不然会扫描整个索引,会增加不必要的读磁盘操作
-
不要使用select * from xxx , 这会增加网络传输的负担,另外也可能不走覆盖索引。
-
不要在where中使用参数 ,mysql解析参数是在运行时,但是优化器是在运行前执行。
where id=@id
-
in和not in要慎用,可以用exists来代替(至于为什么?我还没理解到,我暂时理解为in