赞
踩
说明:5.5 以后的默认引擘,支持事务,行级锁,更好的恢复性,高并发下性能更好,对多核,大内存, SSD等硬件支持更好。
说明:MySQL 的分区表实际性能不是很好,且管理维护成本较高。
说明:使用 utf8 字符集,如果是汉字,占 3 个字节,但 ASCII 码字符还是 1 个字节;统一,不会有转换产生乱码风险。
说明:pk=primary key; uk= unique key; idx=即index的缩写。
正例:project_task、project_config
说明:id 为主键,步长为1自增的bigint类型;
create_time、update_time 为创建和修改时间,均为date_time类型;
is_delete 为删除标识,默认为0,1表示已删除;
说明:float和double在存储的时候,存储精度损失问题,很可能在值比较时得不到正确的结果,如果存储数据范围超过decimal的范围,建议将数据拆成整数和小数分开存储;
1.非频繁修改字段;
2.非varchar超长字段,更不能是text、BLOB字段;
正例:四级地址名称,字符长度较短,几乎不会产生变,适合冗余以减少关联查询;
说明:如果需求调研过程中可预料系统将存储海量数据,参考第五条,否则,如三年后才能达到500万或超2GB的表容量,不推荐设计之初考虑分库分表方案。
说明:适合的类型,不但节约存储空间,节约索引存储,更重要的是可以提升检索速度;
如下表,无符号值可避免误存负数,且扩大的表示范围
对象 | 年龄区间 | 类型 | 表示范围 |
人 | 150岁以内 | unsigned tinyint | 无符号值:0到255 |
龟 | 数百岁 | unsigned smallint | 无符号值:0到65535 |
恐龙化石 | 数千万年 | unsigned int | 无符号值:0到42.9亿 |
太阳 | 约50亿年 | unsigned bigint | 无符号值:0到10的19次方 |
说明:索引长度与区分度是一对矛盾体,一般对于字符串类型数据,长度为20的索引,区分度会高达90%以上,可以使用count(distinct left(列名,索引长度))/count(*)的区分度来确定。前缀索引相关内容可参考MySQL前缀索引和索引选择性 - yayun - 博客园
说明:索引文件具有B-Tree的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。
正例:where a=? and b=? order by c;索引a_b_c。
反例:索引中有范围查找,那么无法复用索引有序性,如where a>100 group by b; 索引a_b无法排序。
说明:合理创建联合索引(避免冗余), index(a,b,c) 相当于 index(a) 、 index(a,b) 、 index(a,b,c)。
说明:如在user_info表phone_num字段为char(11)。
正例:SELECT * FROM user_info WHERE phone_num=’13599998888’
反例:SELECT * FROM user_info WHERE phone_num=13599998888
说明:一个包含查询所需的字段的索引称为 covering index 覆盖索引。MySQL只需要通过索引就可以返回查询所需要的数据,而不必在查到索引之后进行回表操作,减少IO,提供效率。 当你对一个sql 使用explain statement 查看一个sql的执行计划时,在EXPLAIN的Extra列出现Using Index提示时,就说明该select查询使用了覆盖索引。
说明:
consts单表中最多只有一个匹配行(主键或唯一索引);
ref为普通的索引;
range对索引进行范围查询;
反例:explain表的结果,type=index,索引物理文件全扫描 ,速度非常慢,该index级别比range低,与全表扫描小巫见大巫。
说明:Mysql不是跳过offset行,而是取offset+n行,然后返回放弃前offset行,返回n行,那么当offset特别大的时候效率非常低,要么控制返回的总页数,要么对超过特定的阀值的页数进行SQL改写。
正例:先快速定位要获取的id段,然后在关联。
Select a.* from 表1 a,(select id from 表1 where 条件 limit 100000,20)b where a.id=b.id。
1.宁滥勿缺,误认为一个查询就需要建一个索引;
2.宁缺勿滥,误认为索引会消耗空间,严重拖慢新增和更新速度 ;
3.抵制唯一索引,误认为唯一性需要后台应用通过”先查后插”解决;
说明:count(*)会统计值为 NULL的行,而 count(列名)不会统计此列为 NULL值的行。
正例:可以使用如下方式来避免 sum的 NPE问题:SELECT IF(ISNULL(SUM(g)),0,SUM(g)) from table。
1.NULL<>NULL的返回结果是 NULL,而不是 false;
2.NULL=NULL的返回结果是 NULL,而不是 true;
3.NULL<>1的返回结果是 NULL,而不是 true;
说明:让数据库做最擅长的事,降低业务耦合度。
说明:MySQL 最擅长的是单表的主键 / 二级索引查询,Join 消耗较多的内存,产生临时表。
说明:容易将业务逻辑和 DB 耦合在一起,MySQL 不擅长数学运算和逻辑判断,无法使用索引。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。