Mysql数据表设计心得

  • 关于主键的设计
    MySQL默认的数据库引擎是InnoDB,InnoDB默认用B-Tree索引(可理解为"排好序的快速查找结构")。
    注意: 对InnoDB来说
    1: 主键索引既存储索引值,又在叶子中存储行的数据;
    2: 如果没有定义主键,则会使用非空的UNIQUE键做主键 ; 如果没有非空的UNIQUE键,则系统生成一个6字节的rowid做主键;
    聚簇索引中,N行形成一个页。如果碰到不规则数据插入时,会造成频繁的页分裂(因为索引要排好序,如果在建表的时候不提供主键,InnoDB 会自动生成一个主键,这个主键是字符式的,所以当有新数据进来的时候,原先的排序会被打乱,中间的开销会很高。),插入速度比较慢。所以聚簇索引的主键值应尽量是连续增长的值,而不是随机值(不要用随机字符串或UUID),否则会造成大量的页分裂与页移动。
    所以在InnoDB引擎中,必须设计一个主键。而且最好是自增的int类型。
  • 索引的设计
    1.在经常需要搜索的列上,可以加快索引的速度
    2.主键列上可以确保列的唯一性
    3.在表与表的而连接条件上加上索引,可以加快连接查询的速度
    4.在经常需要排序(order by),分组(group by)和的distinct 列上加索引 可以加快排序查询的时间, (单独order by 用不了索引,索引考虑加where 或加limit)
    5.在一些where 之后的 < <= > >= BETWEEN IN 以及某个情况下的like 建立字段的索引(B-TREE)
    6.like语句的 如果你对nickname字段建立了一个索引.当查询的时候的语句是 nickname lick '%ABC%' 那么这个索引讲不会起到作用.而nickname lick 'ABC%' 那么将可以用到索引
    7.索引不会包含NULL列,如果列中包含NULL值都将不会被包含在索引中,复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 ' '字符串
    8.使用短索引,如果你的一个字段是Char(32)或者int(32),在创建索引的时候指定前缀长度 比如前10个字符 (前提是多数值是唯一的..)那么短索引可以提高查询速度,并且可以减少磁盘的空间,也可以减少I/0操作.
    9.不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描
    10.选择越小的数据类型越好,因为通常越小的数据类型通常在磁盘,内存,cpu,缓存中 占用的空间很少,处理起来更快

你可能感兴趣的:(Mysql数据表设计心得)