表设计及操作
- 使用可以存下你的数据的最小的数据类型。
尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED;
VARCHAR的长度只分配真正需要的空间;
使用枚举或整数代替字符串类型;
尽量使用TIMESTAMP而非DATETIME;
单表不要有太多字段,建议在20以内;
避免使用NULL字段,很难查询优化且占用额外索引空间;
用整型来存IP; - 最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库。
- 尽量少用text类型,非用不可可以考虑分表。
- 数据行的长度不要超过8020字节,如果超过这个长度的话在物理页中这条数据会占用两行从而造成存储碎片,降低查询效率。
- 能够用数字类型的字段尽量选择数字类型而不用字符串类型的(电话号码),这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
- 对于不可变字符类型char和可变字符类型varchar 都是8000字节,char查询快,但是耗存储空间,varchar查询相对慢一些但是节省存储空间。在设计字段的时候可以灵活选择,例如用户名、密码等长度变化不大的字段可以选择CHAR,对于评论等长度变化大的字段可以选择VARCHAR。
- 字段的长度在最大限度的满足可能的需要的前提下,应该尽可能的设得短一些,这样可以提高查询的效率,而且在建立索引的时候也可以减少资源的消耗。
- 尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)
- 避免频繁创建和删除临时表,以减少系统表资源的消耗。
- 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
- 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
- 充分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这时在 WHERE 子句中将连接条件完整的写上,有可能大大提高查询速度。
- 使用视图加速查询。
把表的一个子集进行排序并创建视图,有时能加速查询。它有助于避免多重排序 操作,而且在其他方面还能简化优化器的工作。 - 尽量不要用SELECT INTO语句。
SELECT INOT 语句会导致表锁定,阻止其他用户访问该表。
表的拆分
表的垂直拆分
垂直拆分,就是把原来一个有很多列的表拆分成多个表,这解决了表的宽度问题。通常垂直拆分可以按如下原则:
- 把不常用的字段单独放到一张表;
- 把大字段独立存放到一张表;
- 把经常一起使用的字段放到一起。
表的水平拆分
常用的水平拆分方法:
- 对customer_id进行hash运算,如果要拆分成5个表则使用mod(customer_id,5)取出0-4个值。
- 针对不同的hashID把数据存到不同的表中。
挑战:
- 跨分区表进行数据查询
- 统计及后台报表操作