首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

啥,又要为增加一列属性?

需求缘起 产品第一版:用户有用户名、密码、昵称等三个属性,对应设计: user(uid, name, passwd, nick) 第二版,产品经理增加了年龄,性别两个属性,结构可能要变成: user...不太可行,锁时间长 (2)新+触发器?如果数据量太大,新不一定装得下,何况触发器对数据库性能的影响比较高 (3)让dba来搞?新,迁移数据,一致性校验,rename?...dba真苦逼 今天分享2个列扩展性设计上几个小技巧,只占大伙1分钟(下班太晚的话,只能写一分钟系列=_=) 方案一:版本号+通用列 以上面的用户为例,假设只有uid和name上有查询需求,可以设计为...里的字段无法建立索引 (2)ext里的key值有大量冗余,建议key短一些 改进: (1)如果ext里的属性有索引需求,可能Nosql的如MongoDB会更适合 方案二:通过扩展行的方式来扩展属性 以上面的用户为例...新旧两种数据可以同时存在 (3)迁移数据方便,写个小程序可以将新增的属性加上 (4)各个属性上都可以查询 不足: (1)key值有大量冗余,建议key短一些 (2)本来一条记录很多属性,会变成多条记录,行数会增加很多

1.7K90

每日一面 - MySQL添加一列

问题参考自: https://www.zhihu.com/question/440231149 ,mysql中,一张表里有3亿数据,未分,要求是在这个大表里添加一列数据。...答案为个人原创 以前老版本 MySQL 添加一列的方式: ALTER TABLE 你的 ADD COLUMN 新列 char(128); 会造成锁,简易过程如下: 新建一个和 Table1 完全同构的...针对 MySQL 5.6(不包含)之前的版本,通过触发器将一个的更新在另一个上重复,并进行数据同步,当数据同步完成时,业务上修改名为新并发布。业务不会暂停。...这个原理很简单,对于新建一列所有原有数据并不是立刻发生变化,只是在表字典里面记录下这个列和默认值,对于默认的 Dynamic 行格式(其实就是 Compressed 的变种),如果更新了这一列则原有数据标记为删除在末尾追加更新后的记录...=INSTANT, LOCK=NONE; 类似的语句,实现在线增加字段。

2.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL增加唯一索引场景

    MySQL中对于字段、索引的使用,就需要些技巧,否则就会碰到坑,这是初学MySQL,比较不太适应的一个点,看到技术社区推的这篇文章《技术分享 | MySQL添加唯一索引的总结》,就讲到了MySQL...MySQL 5.6 开始支持 Online DDL ,添加[唯一]索引虽然不需要重建,也不阻塞 DML ,但是大场景下还是不会直接使用 Alter Table 进行添加,而是使用第三方工具进行操作,...20 alter table t add addr varchar(20) not null default '北京',add unique key uk_addr(addr); #注意这里是不允许为...#里面保存的是这个改任务的目标库的从库连接信息【mysql_comm】变量的值 #还有数据唯一性的校验SQL【mysql_sql】变量的值 hook_conf="${work_dir}/hook/conf...mysql_comm='mysql -h xxxx -P xxxx -u xxxx -pxxxx db_name'   #这里是从库的地址 mysql_sql="select concat(count(

    2.7K40

    mysql已存在的增加自增字段

    需求: 已有的mysql数据,希望增加一个自增的字段,并设置新数据的初始值。 实际上不复杂,只是做个备忘。...,分两步操作*/ /*首先增加自增字段*/ alter table t_abc add column id int auto_increment primary key; /*执行完上面这一条,字段增加...,但值为*/ /*执行这一条,它会自动为已存在的数据的自增字段赋初值,从1开始,同时将后续新增的数据从100开始*/ alter table t_abc auto_increment=100; 修改已有数据初始值...table t_abc add column id int auto_increment primary key; /*这里没有指定任何数值,执行完后只为自增字段赋从1开始的初始值,其实隐含的设置当前自增字段从...,现在我们应该指定数据库中的maxId+1作为下一个数据的起始值*/ set @maxId=1; select max(id) into @maxId from t_abc; /*中有3条数据,那么maxId

    11.1K10

    MySQL为Null会导致5个问题,个个致命!

    -- 如果存在 person 先删除 DROP TABLE IF EXISTS person; -- 创建 person ,其中 username 字段可为,并为其设置普通索引 CREATE...2.distinct 数据丢失 当使用 count(distinct col1, col2) 查询时,如果其中一列为 NULL,那么即使另一列有不同的值,那么查询的结果也会将数据丢失,如下 SQL 所示...5.增加了查询难度 当某列值中有 NULL 值时,在进行 NULL 值或者非 NULL 值的查询难度就增加了。...等这些表达式就不能使用了,这就增加了查询的难度,尤其是对小白程序员来说,接下来我们来演示一下这些问题。 还是以 person 为例,它的原始数据如下: ?...总结 本文我们讲了当某列为 NULL 时可能会导致的 5 种问题:丢失查询结果、导致指针异常和增加了查询的难度。

    1.8K20

    MySQL:数据库设计Null与非字段的应用及建议

    引言 在数据库设计领域,Null(值)与非(NOT NULL)字段的合理应用对于构建高效、稳定且易于维护的数据库系统至关重要。...本文将深入探讨MySQL数据库中的Null与非字段概念,分析它们各自的特点、使用场景及设计建议,以帮助软件架构师和系统架构师更好地理解和应用这些概念。...非字段 定义:NOT NULL约束确保字段中的值永远不会是Null。 特点: 非字段保证了数据的完整性,适用于必须有值的情况。 在数据模型中,非字段用于强制执行业务规则。...设计建议 明确需求:在设计结构时,首先明确每个字段是否为业务逻辑中的必要元素。 合理使用Null:不应滥用Null,因为它会增加查询逻辑的复杂性,并可能导致意外的结果。...测试与验证:在实际应用中,应进行充分的测试,以确保Null和非字段的逻辑符合业务预期。 结论 正确地应用Null与非字段是MySQL数据库设计的重要方面。

    64720

    【黄啊码】MySQL中NULL和““的区别以及对索引的影响

    为什么Mysql 数据库尽量避免NULL? (1)如果查询中包含可为NULL的列,对Mysql来说更难优化,因为可为NULL的列使得索引,索引统计和值比较都更复杂。 (2)含NULL复合索引无效....(3)可为NULL的列会使用更多的存储空间,在Mysql中也需要特殊处理。...如果全扫描,假设10条数据一个数据块,那么只需访问1000个数据块,既然全扫描访问的数据块 少一些,肯定就不会利用索引了。...3.前导模糊查询不能利用索引(like '%XX'或者like '%XX%') 假如有这样一列code的值为'AAA','AAB','BAA','BAB' ,如果where code like '%AB...估计使用全扫描要比使用索引快,则不使用索引 5.MySQL主要提供2种方式的索引:B-Tree索引,Hash索引 B树索引具有范围查找和前缀查找的能力,对于有N节点的B树,检索一条记录的复杂度为O(LogN

    1K20

    为什么数据库字段要使用NOT NULL?

    来自高性能Mysql中有这样一段话: 尽量避免NULL 很多表都包含可为NULL(值)的列,即使应用程序并不需要保存NULL也是如此,这是因为可为NULL是列的默认属性。...如果查询中包含可为NULL的列,对MySql来说更难优化,因为可为NULL的列使得索引、索引统计和值比较都更复杂。可为NULL的列会使用更多的存储空间,在MySql里也需要特殊处理。...NULL和NOT NULL使用的值代表的含义是不一样,NULL可以认为这一列的值是未知的,值则可以认为我们知道这个值,只不过他是的而已。...举个例子,一张中的某一条name字段是NULL,我们可以认为不知道名字是什么,反之如果是空字符串则可以认为我们知道没有名字,他就是一个值。...为了说明清楚这个存储格式的问题,我弄张来测试,这张只有c1字段是NOT NULL,其他都是可以为NULL的。 ?

    1.9K20

    MySQL count知多少

    5个字段 ,其中主键为字符串类型字段的p1,其他字段为整型的id,非的c1,可为的c2,可为的c3。...其中c1,c2字段内容完全一致,差别是字段约束不一样(c1不可为,c2可为),c3与c1,c2的差别在于c1中aa开头的值在c3中为null,其他内容一样。...) count(可为字段) 性能对比 3.1 MyISAM引擎 3.1.1 查询整张数据量 如果想精确查询一张MyISAM的数据量,使用 count(主键) count(1) count(...server 层拿到主键字段后,判断是不为的(此处其实可以优化),就按行累加。 count(1):也是遍历整张,因为每行的结果都是1(非),所以可以直接计数,无需判断是否为。...由此可见表大小不同,查询效率也不同,越小查询效率越高。 3.2.4 count(普通字段) 因为nums_3的c2字段允许为,但是内容均不为,c3字段允许为,但是存在内容为的情况。

    3.5K20

    MySQL数据库——的约束(非约束、唯一约束、主键约束、外键约束)

    key 1.1 非约束:not null 1)在创建时添加约束: CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL -- name为非...); 2)创建后再添加非约束: ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;  3)删除name的非约束: ALTER TABLE stu MODIFY...UNIQUE ); 注意:MySQL中唯一约束限定的列的值可以有多个null 2)删除唯一约束: -- alter table stu modify number varchar(20); 不同于非约束的删除方法...主键约束:primary key 1)注意: 若某一列添加了该约束,则代表了非,且唯一; 一张只能有一个字段为主键; 主键就是中记录的唯一标识; 2)创建时添加主键约束 CREATE TABLE...外键,就是从中与主表主键对应的那一列,如:员工中的dep_id,其中,主表是一方,用来约束别人的,从可以是多方,被别人约束的。 注意:外键可以为NULL,但是不能是不存在的外键值。 ?

    14.2K21

    数据库约束-主键约束-唯一约束-非约束-默认值

    添加数据信息 INSERT INTO user1 VALUES(1,'tom'); -- 正常插入 INSERT INTO user1 VALUES(NULL,'tom'); -- 插入异常(主键不可为...> -- 插入异常(主键不可为): Column 'id' cannot be null mysql> INSERT INTO user1 VALUES(NULL,'tom'); ERROR 1048..., 主键可以为多个字段 , 不过我们一般增加一个字段 id 来作为主键. ” 执行如下: -- 联合主键: 包含 id 与 name 两个字段作为主键,要求中的数据 id 与 name 结合在一起不能重复...非约束 NOT NULL 被修饰的这个字段必须设置值,不能是NULL 3.1 非约束的基本格式 字段名 字段类型 NOT NULL 3.2 实现非约束 具体操作: 创建学生st8, 包含字段(..., '男'); ERROR 1048 (23000): Column 'NAME' cannot be null mysql> -- 可以看到设置了非约束后,st8无法插入 null 数据 mysql

    6.3K10

    Mysql开发手册

    主键不仅可以是中的一列,也可以由中的两列或多列来共同标识,比如: ? 默认值:默认值约束 (DEFAULT) 规定,当有 DEFAULT 约束的列,插入数据为时,将使用默认值。...唯一:唯一约束 (UNIQUE) 比较简单,它规定一张中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。...外键:外键 (FOREIGN KEY) 既能确保数据完整性,也能表现之间的关系。 Inser 非:非约束 (NOT NULL),听名字就能理解,被非约束的列,在插入值时必须非。...TABLE 原名 TO 新名字; ALTER TABLE 原名 RENAME 新名; ALTER TABLE 原名 RENAME TO 新名; 删除一张 DROP TABLE 名字 增加列...在增加一列的语句格式为: ALTER TABLE 名字 ADD COLUMN 列名字 数据类型 约束; 或: ALTER TABLE 名字 ADD 列名字 数据类型 约束; 删除列 ALTER

    1.6K10

    Mysql-5-数据的基本操作

    ); 2.主键约束:主键又称主码,是一列或多列的组合。...一个可以有一个或者多个外键。外键对应的是参照完整性,一个的外键可以是值,若不为值,则每一个外键必须等于另一个中主键的某个值。 下面介绍几个概念。...语法规则:字段名 数据类型 auto_increment 例:定义数据tb_employee8,指定员工标号自动增加 mysql> create table tb_employee8(id int(11...常用的修改的操作有:修改名,修改字段数据类型或字段名,增加和删除字段,修改字段的排列位置,更改的存储引擎,删除的外键约束等。...int(11) first;(添加到第一列) 例4:mysql> alter table tb_dept1 add column3 int(11) after name;(添加到name后一列) (4)

    1.7K60

    高性能MySQL第四章 读书笔记

    如果数据允许NULL,对MySQL来说更难优化,因为可为NULL的列使得索引,索引统计,和值比较都比较复杂。...MySQL会吧BLOB和TEXT当做一个单独的对象处理,如果他们太大,会使用专门的“外部”存储区域来存储,因此每个值需要1~4个字节存储一个指针。...要确保关联之间的列的数据类型是一致的。 完全随机的字符串会导致INSERT和一些SELECT语句变慢,因为会写到索引的不同位置,导致页分裂,磁盘随机访问。...MySQL服务器层从存储引擎获取数据之后是需要解码成行数据结构的,如果列特别多,那时候CPU占用就会很高,转化的代价就非常大。 合理运用范式和反范式(允许冗余),缓存和汇总表来优化查询和业务。...如果是用到一个统计的计数器,可以增加多几列数据,来增加的使用效果。再对生成的数据进行一个汇总。统计到其中一列数据中去。 重申一遍,字段的数据结构尽可能用小而简单的,总是好的。

    52420

    mysql修改、增加、删除字段名等命令

    Mysql 一、.mysql修改 1.修改字段类型、字段名、字段注释、字段默认值 #修改字段类型、字段注释、字段默认值 ALTER TABLE 名 MODIFY [COLUMN] 字段名 新数据类型...-- COLUMN关键字可以省略不写 alter table box modify column boxnum varchar(40) not null comment '编号' 2.修改字段名 mysql...alter table box comment '座位' 5.在指定位置插入新字段 ALTER TABLE 名 ADD [COLUMN] 字段名 字段类型 是否可为 COMMENT '注释' AFTER...ALTER TABLE 名 ADD COLUMN newname 数据类型 数据长度 默认值 注释 //增加一个字段,默认为 alter table box add column boxroom...int 10 default null comment '座位空间' //增加一个字段,默认不为 alter table box add column boxroom int 10 not null

    1.3K20

    Mysql 架构和索引

    即使索引有多列这样之情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在值,即使对该列建索引也不会提高性能。...更节约空间 BIT TODO SET TODO 索引 索引类型: B-Tree索引:除了Archive引擎外都支持 Hash索引:Memory引擎, 可以在其它B-Tree索引上建立自己的Hash索引:增加一列被索引的列...SELECT被标记为UNION RESULT table 记录查询引用的 TYPE: 访问类型,表示MySQL中找到所需行的方式 从最好到最差: (唯一或非唯一)组合索引的前一部分:select...将遍历全以找到匹配的行 possible_keys 指出MySQL能使用哪个索引在中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用 key 显示MySQL在查询中实际使用的索引...,并非实际使用长度,即key_len是根据定义计算而得,不是通过内检索出的 计算索引长度需要考虑的: 可为的字段需要1字节标志 变长字段需要额外字节保留长度信息,如varchar需要额外的1~2字节

    1.4K90
    领券