命名规范的对象,是指数据库SCHEMA、表TABLE、字段COLUMN、索引INDEX、约束CONSTRAINTS等
dba内部账户以dba_开头;
应用账户以user_开头:如user_upc、user_upc_r 分别代表读写、只读账号;
读写分离不提供额外账户,统一使用应用账户;
所有账户必须都在主库创建,只读查询只能从非候选上操作;
db_00{table_00 - table_31}
db_01{table_00 - table_31}
db_02{table_00 - table_31}
db_03{table_00 - table_31}
支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高
万国码,无需转码,无乱码风险,节省空间,utf8mb4更可保存emoj表情(utf8不行)
N年后鬼知道这个r1,r2,r3字段是干嘛的
1. 主键递增,数据行写入可以提高插入性能,可避免page分裂,减少表碎片提升空间和内存的使用
2. 主键要选择较短的数据类型,Innodb引擎普通索引都会保存主键的值,较短的数据类型可以有效的减少索引的磁盘空间,提高索引的缓存效率
3. 无主键的表删除,在row模式的主从架构,会导致备库夯住
外键使得表之间相互耦合,影响update/delete等SQL性能,有可能造成死锁,高并发情况下容易成为数据库瓶颈
浮点数(float和double)在存储的时候,超过指定精度后会四舍五入,这是浮点数特有的问题。因此在精度要求比较高的应用中(比如货币)要使用定点数(decimal)而不是浮点数(float和double)来保存数据。
1. 对于长度基本固定的小字符类型,如果该列恰好更新又特别频繁,适合char
2. 不固定长度的大字符类型,应选择varchar类型,varchar(N),N代表的是字符数,N尽可能的小
3. varchar虽然存储变长字符串,UTF8最多能存21844个汉字,或65532个英文
使用tinyint来代替enum和boolean
使用Decimal代替float/double存储精确浮点数
建议使用 UNSIGNED 存储非负数值
int使用固定4个字节存储,int(11)与int(4)只是显示宽度的区别
列禁止使用bit类型,请用tinyint类型替代。bit类型加了索引可能会导致sql结果不准。
timestamp可以在insert/update行时,自动更新时间字段;
列为timestamp类型,必须指定默认值,要么current_timestamp,要么'1970-01-02 01:01:01',不要设置为''或0;
DATETIME和TIMESTAMP都可用来表示YYYY-MM-DD HH:MM:SS类型的日期。两种都保存日期和时间信息,毫秒部分最高精确度都是6位数。建议使用TIMESTAMP(3)。
A. TIMESTAMP占用4字节,DATETIME占用8字节,当保存毫秒部分时两者都使用额外的空间 (1-3 字节)。
B. TIMESTAMP的取值范围比DATETIME小得多,不适合存放比较久远的日期。TIMESTAMP只能存储从 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999' 之间的时间。而DATETIME允许存储从 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999' 之间的时间。
C. TIMESTAMP的插入和查询受时区的影响。如果记录的日期需要让不同时区的人使用,最好使用 TIMESTAMP。
ip转int使用 INET_ATON 函数,int转ip使用 INET_NTOA 函数,比如:select inet_aton('192.168.1.1'),inet_ntoa(3232235777);
1. 涉及到国家代号,可能出现+/-/()等字符,例如+86
2. 手机号不会用来做数学运算
3. varchar可以模糊查询,例如 like '138%'
选择性的计算方式为: select count(distinct(col_name)) / count(*) from tb_name
如果结果小于0.2,则不建议在此列上创建索引,否则大概率会拖慢SQL执行
前缀索引的缺点是,如果在该列上 ORDER BY 或 GROUP BY 时无法使用索引,也不能把它们用作覆盖索引
如果5个字段还不能极大缩小row范围,八成是设计有问题
比如索引idx_a_b_c(a,b,c),相当于创建了(a)、(a,b)、(a,b,c)三个索引,后二者为冗余索引:
where a=? 用到(a) ⑦where c=? 用不到
where b=? and a=? 用到(a,b) ⑧where b=? and c=? 用不到
where a=? and c=? 用到(a)
where a>? and b=? 用到(a)
where a=? and b=? and c>? 用到(a,b,c)
where a=? and b>? and c=? 用到(a,b)
高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。数据库擅长存储与索引,涉及CPU计算的还是放到应用服务器上吧
指定字段插入,在表结构变更时,能保证对应用程序无影响
SELECT * FROM tel_record t1 INNER JOIN (SELECT id FROM tel_record WHERE qiye_id = xxx ORDER BY id DESC LIMIT 999900,100) t2 ON t1.f_id = t2.f_id;
程序端保留当前页的最小id、最大id(id是主键),降序情况下,每次提取下一页的数据时,id < min_id order by id desc limit 100; 上一页 id > max_id order by id desc limit 100
增加新的ENUM值要做DDL操作;ENUM的内部实际存储就是整数而非字符串;
旧版本mysql的OR查询是不能命中索引的,即使能命中索引,为何要让数据库耗费更多的CPU帮助实施查询优化呢? 补充:通常情况下,如果条件中有or,即使其中有条件带索引也不会使用,所以除非每个列都建立了索引,否则不建议使用OR。在多列OR中,建议用UNION ALL替换。
例如,where 条件里面有<>、not in 、not exists的时候,即便是在这些判断字段上加有索引,也不会起作用。
1. 不要使用count(列名)或者count(常量)来替代 count(*),count(*)是SQL92定义的标准统计行数的语法,跟数据库无关,跟null和非null无关。count(*)会统计值为null的行,而count(列名)不会统计此列为null的行。
2. count(distinct col)计算该列除null之外不重复的行数。count(distinct col1, col2),如果其中一列全为null,那么即使另一列有不同的值,也返回0
3. 当某一列的值全为null,count(col)的返回结果为0,但sum(col)的返回结果为null,因此使用sum()时需要注意空指针异常的问题。可以使用ISNULL()来判断是否为NULL值: SELECT IF(ISNULL(SUM(g)), 0, SUM(g)) FROM table;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。