💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 将字段很多的表分解成多个表 对于字段较多的表,可以将这些数据分离出来形成新表.因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变低. 假设会员信息表存储会员登录认证信息,该表中有很多字段,如id/姓名/密码/地址/电话/个人描述等....其中地址,电话,个人描述等字段并不常用,可以分离出来形成新的表. ### 创建表 ```sql create table user1 ( id ini(11) not null auto_increment, ... primary key (id) ); create table user2 ( id int(11) not null default 0, ... ) ``` ### 数据操作思路 #### 插入数据 先插入user1表数据,然后拿到id,然后再将剩余的数据和id插入user2表中 #### 查询数据 ```sql select * from user1 left join user2 on user1.id = user2.id; ``` #### 删除数据 可以使用触发器 ## 添加中间表 对于需要经常联合查询的表,可以建立中间表以提高上查询效率.通过建立中间表,把需要经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率. ## 增加冗余字段 按照范式原则应该减少冗余字段,但是,合理地增加冗余字段可以提高查询速度. 表的规范化越高,表与表之间的关系就越多,需要连接查询的情况也就越多. ## 优化插入记录的速度 插入数据时,影响插入速度的主要是索引/唯一索引的校验/一次插入数据的条数. ### 插入多条语句 如果插入大量数据,建立索引会降低插入记录的速度,回了解决这种情况,可以在插入前禁用索引,数据插入完毕后再开启索引. > 对于空表批量导入数据,则不需要进行次操作,因为MyISAM引擎的表是在导入数据之后才建立的 #### 禁用索引 ```sql alter table 表名 disable keys; ``` #### 重新启用索引 ```sql alter table 表名 enable keys; ``` ### 禁用唯一性检验 插入数据时,MySQL会对插入的记录进行唯一性校验.这种唯一性校验也会降低插入记录的速度,为了降低这种情况对速度的影响,可以在插入记录前禁用唯一性检验,等到记录插入完毕后再开启. #### 禁用唯一性校验 ```sql set unique_checks = 0; ``` #### 开启唯一性校验 ```sql set unique_checks = 1; ``` ### 使用批量插入 插入多条语句记录时,可以使用一条一条插入,也可以使用一次插入多条,一次插入多条的速度会快过一条一条插入 ### InnoDB表优化 #### 禁用唯一性校验 ##### 关闭 ```sql set unique_checks = 0; ``` ##### 开启 ```sql set unique_checks = 1; ``` #### 禁用外键检查 ##### 关闭 ```sql set foreign_key_checks = 0; ``` ##### 开启 ```sql set foreign_key_checks = 1; ``` #### 禁止自动提交 ##### 关闭 ```sql set autocommit = 0; ``` ##### 开启 ```sql set autocommit = 1; ``` ## 分析表/检查表/优化表 ### 分析表 主要分析关键字的分布 ```sql analyze [local | no_write_to_binlog] table 表 [,表2...]; ``` local是no_write_to_binlog关键词的别名,表示不写入二进制日志 结果信息解释 |参数|说明| |-|-| |Table|表示分析的表的名称| |Op|表示执行的操作,analyze表示进行分析操作| |Msg_type|表示信息类型: 状态status/信息(info)/注意(note)/警告warning/错误(error)| |Msg_text|显示信息| ### 检查表 主要检查表是否存在错误 > option只对MyISAM类型的表有效,执行过程中会加上只读锁 ```sql check table 表名 [,表名...] option = {quick|fast|medium|extended|changed} [option...]... ``` |参数|说明| |quick|不扫描行| |fast|只检查没有被正确关闭的表| |medium|扫描行| |extended|对每行的所有关键字进行全面查找| |changed|只检查上次检查后被更改的表| ### 优化表 主要是删除或者更新造成的空间浪费 > 对InnoDB和MyISAM类型都有效,但是只能优化表中的varchar/blob或text类新的字段 ```sql optimize [local|no_write_to_binlog] table 表名 [,表名...]; ``` local是no_write_to_binlog关键词的别名,表示不写入二进制日志