数据库的设计与优化
数据库的设计
第一点
E-R(实体-关系)
第二点
三范式
1.所有的域都应该是原子性的即每一列都是不可分割的原子项
2、确保数据库表中的每一列都和主键相关(主要针对于联合主键相关)
3、确保每列都与主键直接相关,而不是间接相关
数据库的优化
第一点
select语句中避免使用(*)
第二点
索引失效的情况
1、但某列建立索引,不能使用not null或is null否则索引会失效
2、索引列上不要使用函数
SELECT Col FROM tbl WHERE substr(name ,1 ,3 ) = ‘ABC’(不)
SELECT Col FROM tbl WHERE name LIKE ‘%ABC%’ (不)
SELECT Col FROM tbl WHERE name LIKE ‘ABC%’ (使用)。
3、索引列不能进行计算,否者索引会失效
SELECT Col FROM tbl WHERE col / 10 > 10 则会使索引失效
应该改成SELECT Col FROM tbl WHERE col > 10 * 10
4、索引列上不要使用Not( !=,<>)
如:SELECT Col FROM tbl WHERE col ! = 10 应该
改成:union。
Select col from tbl where col>10
Union
Select col from tbl where col<10
第三点
用union替换or(适用于索引列)
union:是将两个查询结果集进行追加在一起,不会引起列的变化,由于是追加操作。需要两个结果集的列数应该相关,并且相应的列的数据类型也应该相当
union返回两个结果集,同时将两个结果集重复项进行消除,如果不进行消除,使用union all
通常情况下,用union替换where子句的or将会起到较好的效果,对索引列使用or会造成全表扫描
注意, 以上规则只针对多个索引列有效.
如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低
用exists替代in、用not exists替代not in
在许多基于基础表的查询中, 为了满足一个条件, 往往需要对另一个表进行联接. 在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.
在子查询中, NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下, NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历).
为了避免使用NOT IN, 我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.
高效: SELECT * FROM EMP (基础表) WHERE EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)
低效: SELECT * FROM EMP (基础表) WHERE DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)
第四点
备份与还原
备份:Mysqldump -uroot -proot dbname > d:/t.sql
还原: mysql -uroot -p dbname < C:\backup.sql #切记一定不要加分号
注意:dbname表示是数据库名称