nysql高性能索引设计

为什么数据库中要使用B+tree索引,而不用hash索引?MySQL中的B+tree索引介绍》 

只有看完以上这篇文章,才会明白为什么下面要这么设计。

 

1、能设计成数字类型的,就不要使用varchar,因为比如varchar(20),mysql就一定会开辟20个字节的内存出来,在计算的时候。

2、需要数字绝对精确的,可以设计Decimal类型,可是该类型在计算的时候对于性能有一定牺牲。decimal存储的是65个数字,以字符形式存储。

3、数字类型字段,一般情况下bigint(11)  float  double类型就够了。

4、一个字段标记为unsigned无符号设计和不标记,没有性能上差别,计算起来都是一样的。

5、如果有blob或者text这种大量字符串存储的字段,可以把该字段独立出来一张新表,用id关联即可。

6、用enum枚举来替代字符串,但是enum类型order by效率低,需要额外操作。一般建议定义为tinyint类型。

7、定义主键ID !!! 重要的事情说三遍!因为即使不定义主键,mysql也会默认生成一个隐式主键,还不如有个显式主键,利用主键索引,提高查询效率。

 8、日期类型的设计选择datetime, dateime的时间区间是 1001年 - 9999年,而timestamp的时间区间是 1970年 - 2038年,前者用8个字节存储,后者用4个字节存储。另外datetime跟时区没关联,而timestamp跟时区是有关联的。

     需要注意的是,这两者日期类型都只精确到秒。那怎么存储更精确的时间呢?用 bigint 类型存储时间戳即可。

9、尽量避免字段存储null,因为mysql在计算null时需要额外开销,所以友好的设计是:not null default

10、索引命名也很重要,主键索引命名pk_前缀,唯一索引uk_前缀,普通索引 idx_前缀。

11、是或否的字段,用 is_前缀。

 

高性能索引使用策略:

1.不在索引列上做任何操作。比如upper(索引列)

2.尽量全值匹配。比如 index_column = 100

3.最佳左前缀法则。

4.范围条件放最后

5.覆盖索引尽量用

6.不等于要慎用。用的不好就会全表扫描

7.Null/Not有影响。请参考《mysql5.7字段设计需要为非null,尤其是索引列,原理讲述

8.Like查询要当心。比如不能 like "%abc" 这样使用

9.字符类型加引号。比如不要这样使用: where username = 6   mysql会尝试加隐式函数,比如where cast(username) = 6 这样会使索引失效

10.使用or关键字时要注意

11.使用索引扫描来做排序

12.ASC,DESC别混用。就是别混合使用,比如 order by age asc,username desc

13.尽可能按主键顺序插入行

14.优化Count查询

15.优化limit分页。select * from t_user limit 10000,10;  mysql会取出10010条数据后,把前面一万条扔了,返回给你最后10条。可以改成:select * from t_user where id > 10000 limit 10;(推荐)    或者:   select * from (select id from t_user limit 10000,10) b, t_user a where a.id = b.id;

 

end.

posted on 2021-06-10 21:04  梦幻朵颜  阅读(76)  评论(0编辑  收藏  举报