数据库优化

关于创建表时的


  • 某一字段只有几个选项(比如民族,性别等),建议采用TINYINT
  • 建议使用UNSIGNED存储非负数值
  • 存储时间(精确到秒)建议使用TIMESTAMP类型,因为TIMESTAMP使用4字节,DATETIME使用8个字节
  • 存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE
  • 避免使用NULL字段(NULL字段很难查询优化,NULL字段的索引需要额外空间
    NULL字段的复合索引无效)
  • 能用数字类型,就不用字符串类型(首先数据库处理数字比字符要快,在正常情况下查询数字就比查询字符要快
    对数字建立索引也要比字符快)(比如电话号码)

数据的检索效率是:char > varchar > text
经常变化的字段用varchar;知道固定长度的用char;能用varchar的地方不用text;

关于外键

  • 尽量不适用外键,用程序来保证约束

关于索引


  • 选择唯一性索引
  • 为经常需要排序、分组和联合操作的字段建立索引
  • 为常作为查询条件的字段建立索引
  • 限制索引的数目
  • 尽量使用数据量少的索引
  • 删除不再使用或者很少使用的索引
  • 尽量选择区分度高的列作为索引
  • 索引列不能参与计算,保持列“干净”(如果计算,导致索引不被使用)

以通配符%和_开头作查询时,MySQL不会使用索引
不使用NOT IN和<>操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL

关于查询

避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引

.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0

避免在 where 子句中使用!=或<>操作符,避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,(如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10 union all select id from t where num=20)

in 和 not in 也要慎用,否则会导致全表扫描 ,连续数值,用between,不用in

模糊查询,尽量避免以模糊自开头的查询,比如name like “%王”,采用全局搜索

很多时候用 exists 代替 in 是一个好的选择:select num from a where num in(select num from b) 应该为: select num from a where exists(select 1 from b where num=a.num)

.尽量避免大事务操作,提高系统并发能力

最左前缀匹配原则,非常重要的原则。

limit越大,效率越低
select id from t limit 10000, 10; 改为 select id from t where id > 10000 limit 10;

使用union all替代union 因为union有去重开销

请使用同类型比较

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章