如何在mysql中建立数据库表 mysql创建数据表教程

说白了,在MySQL中创建数据库表其实非常简单。
关键是正确设计表结构并注意数据类型、约束和索引设置。
我们先来说说最重要的事情。
表结构设计是否正确,直接影响数据库的性能和数据完整性。

我们去年做的项目,由于表结构设计不合理,导致查询效率非常低。
大约3 000条数据,查询时间实际上超过了几分钟。
很多人没有注意到这一点。
事实上,优化数据类型和约束是关键。

还有一点是,选择合适的索引设计也同样重要。
例如,在创建用户信息表时,我们为用户名和电子邮件地址都创建了索引,这大大提高了查询速度。
另一个重要的细节是选择字符集和排序规则。
我们建议使用 utf8 mb4 字符集,它可以为特殊符号和表情符号提供更好的支持。

起初我认为如果我选择了正确的数据类型,表就会高效地运行。
但后来我发现这是错误的。
如果索引设计过多,查询速度也会很慢。
等等,还有一个问题。
这意味着虽然外键可以帮助确保数据一致性,但如果与 INNODB 引擎没有正确协调,它们也可能导致性能问题。

所以我的建议是在创建表之前做好计划,保留扩展字段,使用测试数据检查性能和完整性,并定期检查表结构以确保一切顺利运行。
最后,您应该避免过多的索引,尤其是对于频繁更新的表。
用技术术语来说,这称为雪崩效应。
事实上,前部的一个小延迟就会导致整个后部的下降。

在mysql中如何创建数据表 新建表sql写法

我记得去年开始接一个电商项目的时候,数据库表设计得一塌糊涂。
许多客户创建的表使用 INT 作为主键。
有些字段没有非空约束; NULL值总是出现在查询中。
加班到半夜,看着那些乱七八糟的SQL,想砸键盘。

其实主要有三点。
例如,在用户表中我直接重新设计了所有字段。
使用 id 自动递增,使用户名为空;使电子邮件唯一并输入默认值。
请注意,create_at 和 Updated_at 均使用 DEFAULT CURRENT_TIMESTAMP 来调整系统时间。
最烦人的是所有表都换成了utf8 mb4 客户端以前使用的GBK其实是一个陷阱。
甚至表情符号也被存储为乱码。

等等,突然想到这个标签。
我在电子邮件中添加了标签,但观察表明写入速度较慢。
我们发现每天向该表插入数据的新用户数量非常大,以至于每次执行 INSERT 时都必须更新索引。
后来,切换到只索引必填字段的覆盖索引性能立即恢复。
教训是真的。
各项指标也好不到哪里去。

现在想想,那些表总是以大写字母命名,比如ORDER_ITEMS,光是看着就让人头疼。
切换到下划线命名法后;阅读更加流畅。
定义InnoDB中的所有表使得事务管理更加方便。
有一次我使用MyISAM制作报表时,由于同时写入,整个数据库被关闭。

但是有件事我从来没想过。
在TEXT字段中,最初执行全文搜索,其中用户声明存储了用户描述。
因此,CPU占用率一直居高不下。
后来被拆分成单独的文件表并与主键相关,使得查询速度更快。
难道这就是要把混乱留给以后逐渐改变的套路吗?
在目前的设计中,每个表都会存储状态、评论等几个常用字段。
虽然占用一点空间,但更改字段名称比更改所有相关表要简单。
每次创建表时,添加注释。
现在当我们看 SQL 时;你一看就明白它是做什么用的。
例如,users(id, 用户名, email) comment '用户信息表';这比只看表名要明显得多。

我立即想到了要检查的极限。
MySQL 8 .0 实现了这一点。
之前使用的是触发模拟;代码写得乱七八糟。
现在只需编写age INT CHECK(age > 0 且age < 1>不过该客户还在使用5 .7 ,只能等待下一次升级。

最烦人的是保留字。
本来有一个表叫group_by但是创建表的时候总是报错,所以最后改成了group_by_table。
所以命名规则确实不能省略。
还有DEFAULT CURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,写完一次就让我想吐。
幸运的是,SQL 编辑器会提示您重命名它。

现在在创建表格之前,我将绘制一个简单的 ER 图。
并不复杂,但是字段类型和参数都标注的很清楚,改的时候不容易出错。
例如,用户表中,用户名不能为空;电子邮件必须是私人的;并且password_hash 必须是VARCHAR(2 5 5 )。
如果这些细节写错了,后果将是无穷无尽的。

存储引擎的选择也很重要。
InnoDB是正常的,但是表是MyISAM中存储的日志表,可以更快的查询。
客户声称这种方式备份速度更快,但我不知道这是不是真的。
不管你说什么,在选举前你都要想清楚。

其实,最大的教训就是不要害怕重构。
旧系统表的设计很糟糕,所以我直接创建了一个新表,并使用存储过程慢慢迁移旧数据。
虽然花了两周时间。
新手表使用起来更有趣。
现在当顾客问起那块很酷的手表时,我会说这是历史遗留的问题。

但是我有一个问题,我们如何将这些大表拆分为数据库和表?现在user表有几百万条记录,查询还是很快的。
但还需要多少年才能发展?不应该分吗?拆分之前需要重新设计所有表吗?

怎样在mysql中创建数据库表 mysql建库建表完整流程

嗯...创建数据库和表...这个东西...刚开始做的时候...真的很头疼。

先说数据库的创建...在MySQL中...是CREATE DATABASE...然后给数据库起个名字...比如my_database...然后指定一个字符集...utf8 mb4 ...这个很重要...它支持...的类型...像表情符号...泰迪熊...然后排序规则...utf8 mb4 _unicode_ci...这个东西...我真的需要考虑一下...用了才发现...不然事情就这样了令人困惑...这确实有问题...
然后...转到这个库...即USE...USE my_database;...然后创建一个表...例如,用户表...用户...在这个表中...有一个id...自动递增...类型int...主键...和用户名...varchar(5 0)...不能为空...必须是唯一的...同样适用于电子邮件...不能为空...唯一...时间戳...默认是当前时间...TIMESTAMP DEFAULT CURRENT_TIMESTAMP;...这些列...数据类型...int、varchar、decimal...这些常用的...不要盲目使用...TEXT...可能用得比较少...
所以...订单表...orders...有一个id...主键...user_id...关联的用户表的id...不能为空...订单日期...不能为空...总金额...不能为空...这里使用了外键...FOREIGN KEY (user_id) REFERENCES users(id);... 这一步...小心...引用错误...该怎么办...
然后...也许...查询很慢...需要添加索引...单列索引...例如用户名... CREATE INDEX idx_username ON users(username);...复合索引...例如订单表...按user_id, order_date排序... CREATE INDEX idx_user_order ON Orders(user_id, order_date);...但不要添加太多...写入会很慢...
更多...表很大...可以分区...例如按年份划分...PARTITION BY RANGE (YEAR(created_at))...像我之前的...2 02 0,2 02 1 ,2 02 2 ...分开...查询很快...
另外...定期这样做...用户OPTIMIZETABLE;...碎片整理...重建索引...
存储引擎...InnoDB...支持事务...适合现在的情况...高并发...MyISAM读取速度快...但是不支持事务...不行...
数据类型...不要盲目使用...数字用int...短字符串用varchar...
整个过程...就这些...慢慢来...也许我比较极端...但我真的得一步一步做...不认为这是理所当然的...2 02 2 年的那一刻...我也是这么理解的...那个可能有点啰嗦……

怎样新建mysql数据库和表

概括地说,使用MySQL管理工具创建数据库和表只有三个步骤:连接到服务器,给数据库命名,然后给表命名。
但不要认为这很容易。
复杂性在于细节。

首先,最重要的是编码格式必须统一为UTF-8 去年我们跑电商项目的时候,忘记了这一步。
结果用户上传的表情符号全部变成乱码,甚至改完就变成秃头了。
还有就是建表的时候要注意字段设计。
例如,用户ID使用INT自增作为主键,手机号码使用VARCHAR(1 1 )且不为空。
一开始就别想用TEXT来省事——去年我们跑项目的时候,TEXT字段在3 000左右的时候就拖慢了查询速度。
还有一个更重要的细节。
命名时不要使用大写字母或汉字。
使用小写和下划线样式,如 user_info。
Navicat 默认不识别汉字,更不用说其他工具了。
老实说,这是一个骗局,很多人并没有注意到这一点。

一开始我以为桌子越多越好,但后来发现这是错误的。
将一个复杂的业务分成3 -5 个相关的表就足够了。
等等,还有一件事,创建表时不要忘记添加索引。
我们有一个旧项目,一张表中有 5 00 万条数据。
没有索引的查询非常慢。
用行话来说,这称为雪崩效应。
事实上,前面的一个小小的延迟就会导致一切都落后。

建议先在测试环境中尝试几种组合,看看哪一种表现最好。
你认为使用默认的InnoDB引擎就足够了吗?