mysql面试--数据库优化

来源:互联网 发布:网络打印机安装失败 编辑:程序博客网 时间:2024/06/08 19:43

Mysql数据库的优化一般从sql及索引优化、表结构优化、系统配置优化、硬件优化四个方面来考虑

表结构优化:

1. 避免使用NULL

   NULL对于大多数数据库都需要特殊处理,MySQL也不例外,它需要更多的代码,更多的检查和特殊的索引逻辑,有些开发人员完全没有意识到,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默认值。

2. 尽可能使用小的字段:

    MySQL从磁盘读取数据后是存储到内存中的,然后使用cpu周期和磁盘I/O读取它,这意味着越小的数据类型占用的空间越小,从磁盘读或打包到内存的效率都更好,但也不要太过执着减小数据类型,要是以后应用程序发生什么变化就没有空间了。修改表将需要重构,间接地可能引起代码的改变,这是很头疼的问题,因此需要找到一个平衡点。如能使用char类型的,就不要使用varchar类型

3. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。


sql及索引优化:

1. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描

2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

3.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描

 4.   应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
  select id from t where num/2=100
  应改为:
  select id from t where num=100*2

5.下面的查询也将导致全表扫描:
  select id from t where name like '%abc%'若要提高效率,可以考虑全文检索。

6..in 和 not in 也要慎用,否则会导致全表扫描,如:
  select id from t where num in(1,2,3)
  对于连续的数值,能用 between 就不要用 in 了:
  select id from t where num between 1 and 3

7.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

select id from t where datediff(day,createdate,'2005-11-30')=0--'2005-11-30'生成的id ,应改为

select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

8.索引建立:

表记录太少,经常插入、删除、修改的表,数据重复以及分布平均的表字段,不适合建立索引



原创粉丝点击