
概述
表的设计合理化(符合3大范式)。 添加索引(index) [普通索引、主键索引、唯一索引unique、全文索引]。 分表技术(水平分割、垂直分割)。 读写[写: update/delete/add]分离。
合理设计表

表1存在冗余表2的数据,正常的设计都会设计成如下:

注意: 反第三范式: 但是没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。
Sql优化
create table user
(id int unsigned primary key auto_increment ,
name varchar(32) not null defaul ‘’);复制
alter table 表名 add primary key (列名);
//举例
alter table user add primary key (id);复制
比如:
create table user(
id int unsigned,
name varchar(32)
)
create index 索引名 on 表 (列1,列名2);复制
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
)engine=myisam charset utf8;复制
select * from articles where body like ‘%非科班%’; //不会使用到全文索引
// 查看是否使用索引:
explain select * from articles where body like ‘%非科班%’
// 正确的用法是:
select * from articles where match(title,body) against(‘非科班’);复制
在mysql中fulltext 索引只针对 myisam生效 mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文 使用方法是match(字段名..) against(‘关键字’) 全文索引一个 叫 停止词, 因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.
当表的某列被指定为unique约束时,这列就是一个唯一索引
// 创建
create table user(id int primary key auto_increment , name varchar(32) unique);复制
create table user(id int primary key auto_increment, name varchar(32));
create unique index 索引名 on 表名 (列表..);复制
desc 表名 //不能够显示索引名
show index(es) from 表名
show keys from 表名复制
alter table 表名 drop index 索引名;
//如果删除主键索引。
alter table 表名 drop primary key复制
肯定在where条经常使用 该字段的内容不是唯一的几个值 字段内容不是频繁变化

id:查询的序列号。 select_type:查询类型。 table:查询表名。 type:扫描方式,all表示全表扫描。 possible_keys:可是使用到的索引。 key:实际使用到的索引。 rows:该sql扫面了多少行。 Extra:sql语句额外的信息,比如排序方式
在使用group by 分组查询时,默认分组后,还会排序,可能会降低速度,在group by 后面增加 order by null 就可以防止排序。如下图所示

有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。
select * from dept, emp where dept.deptno=emp.deptno;
// 替换成
select * from dept left join emp on dept.deptno=emp.deptno;复制
正确的选择mysql的存储引擎

如果你的数据库的存储引擎是myisam,请一定记住要定时进行碎片整理
分表技术
为什么要分表?
(1) 如果一个表的每条记录的内容很大,那么就需要更多的IO操作,如果字段值比较大,而使用频率相对比较低,可以将大字段移到另一张表中,当查询不查大字段的时候,这样就减少了I/O操作
(2)如果表的数据量非常非常大,那么查询就变的比较慢;也就是表的数据量影响这查询的性能。
(3)表中的数据本来就有独立性,例如分别记录各个地区的数据或者不同时期的数据,特别是有些数据常用,而另外一些数据不常用。
(4) 分表技术有(水平分割和垂直分割)
(id, titile, summary, content, user_id, create_time),因为文章中的内容content会比较长,放在tbl_articles中会严重影响表的查询速度,所以将内容放到tbl_articles_detail(article_id, content),像文章列表只需要查询tbl_articles中的字段即可。
用户表可以根据用户的手机号段进行分割如user183、user150、user153、user189等,每个号段就是一张表 用户表也可以根据用户的id进行分割,加入分3张表user0,user1,user2,如果用户的id%3=0就查询user0表,
如果用户的id%3=1就查询user1表对于订单表可以按照订单的时间进行分表
读写分离
(1)配置多数据源。
(2)使用mysql的proxy中间件代理工具。
MySQL的主从复制和读写分离两者有着紧密的联系,首先要部署主从复制,只有主从复制完成了才能在此基础上进行数据的读写分离。

读写分离的原理
读写分离就是只在主服务器上写,只在从服务器上读。基本原理是让主数据库处理事务性查询,而从服务器处理select查询。数据库复制被用来把事务性查询导致的变更同步到从数据库中。
近期精彩内容推荐:
文章转载自程序员大咖,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
墨天轮个人数说知识点合集
JiekeXu
422次阅读
2025-04-01 15:56:03
MySQL数据库当前和历史事务分析
听见风的声音
414次阅读
2025-04-01 08:47:17
MySQL 生产实践-Update 二级索引导致的性能问题排查
chengang
379次阅读
2025-03-28 16:28:31
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
337次阅读
2025-04-15 23:49:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
336次阅读
2025-04-17 17:02:24
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
322次阅读
2025-04-15 14:48:05
云和恩墨杨明翰:安全生产系列之MySQL高危操作
墨天轮编辑部
300次阅读
2025-03-27 16:45:26
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
283次阅读
2025-04-07 12:14:29
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
186次阅读
2025-04-15 15:27:53
[MYSQL] 服务器出现大量的TIME_WAIT, 每天凌晨就清零了
大大刺猬
179次阅读
2025-04-01 16:20:44