1.优化思路
在数据库的优化上我们有两个方面,一方面是安全,另一方面则是性能.
安全 ,就是要保证数据的可持续性;
性能,则说的就是数据的高性能访问;
2.优化方法
1)选取最适用的字段属性
一般来说,数据库中的表越小,查询执行的效率越快,因此我们可以在创建表的时候将字段竟可能设定的小一点,这样增加了数据库的空间.
另一个方法则是在可能的情况下,尽量把字段设置为非空,这样查询的时候就不用去比较NULL值,从而提升查询速度
2)使用连接查询代替子查询
子查询可以轻松解决很多疑难需求,但需要注意,子查询中,select 关键字出现的越多,查询效率越低; 使用子查询的话数据库需要在内存中先创建出临时表,然后再把临时表用在另一个查询上,子查询可以一次性完成很多逻辑上多个步骤才能完成的SQL操作,这样查询速度不是很快,而采用连接查询的话,MYSQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作.
3)使用联合来代替手动创建的临时表
使用UNION查询,可以把 需要使用临时表的两条或更多的 SELECT 查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。使用 UNION 来创建查询的时候,我们只需要用 UNION作为关键字把多个 SELECT 语句连接起来就可以了,要注意的是所有 SELECT 语句中的字段数目要想同 .
SELECT * FROM t_address UNION SELECT * FROM t_area;
4)事务
当这个语句块中的某一条语句运行出错的时候,整个语句块的操作就会变得不确定起来。设想一下,要把某个数据同时插入两个相关联的表中,可能会出现这样的情况:第一个表中成功更新后,数据库突然出现意外状况,造成第二个表中的操作没有完成,这样,就会造成数据的不完整,甚至会破坏数据库中的数据。要避免这种情况,就应该使用事务,它的作用是:要么语句块中每条语句都操作成功,要么都失败。换句话说,就是可以保持数据库中数据的一致性和完整性。事物以BEGIN 关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。
BEGIN;
INSERT INTO salesinfo SET CustomerID=14;
UPDATE inventory SET Quantity=11
WHERE item='book';
COMMIT;
事务的另一个重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰。
5)使用外键
外键可以用来维护两表之间的一致性,通过设置外键和其他表建立关联关系,即保证数据的关联性,如果要在 MySQL 中使用外键,一定要记住在创建表的时候将表的类型定义为事务安全表 InnoDB类型。该类型不是 MySQL 表的默认类型。定义的方法是在 CREATE TABLE 语句中加上 TYPE=INNODB。
6)使用索引
索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(), MIN()和ORDERBY这些命令的时候,性能提高更为明显。
索引并不是越多越好,索引固然可以提高响应的查询(select)的效率,但是同时也降低了插入(Insert) 和 更新(update) 的效率,因为insert或者update时有可能会重建索引,所以怎样建索引需慎重考虑,根据具体情况而定.
一般说来,索引应建立在那些将用于JOIN, WHERE判断和ORDER BY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。
7)优化查询语句
绝大多数的情况下,使用索引可以提高查询的速度,但是如果SQL语句使用不恰当的话,索引将无法更好的发挥它的作用.
应该注意一下几点 :
1. 最好是在相同的类型字段之间进行比较
如INT类型建议不要和BGINT类型的比较,但也有特殊情况,比如,char和varchar类型字段大小相等时也可以将它们进行比较
2. 在建有索引的字段上尽量不要使用函数进行操作
3.避免在查询中让数据库进行自动类型转换,这样也会让索引变得不起作用
4. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
5. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
6. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
7. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
8. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
9. 应尽量避免在语句中使用 in 和 not in 关键字 ,这将导致引擎放弃使用索引而进行全表扫描
10. 如果语句中存在like 的话 , 应尽量避免出现 % xx % 这种两侧都出现 % 的条件,单侧 %xx 可以使用索引,多侧 %xx%不可以
这是小喵这次的总结,你Get到啦吗?
(^_^)~喵~!!