我们在做一个项目, 一个网站或一个 App 时, 用户量巨增, 当使用的 MySQL 数据库中的表数据达到千万级时, 可以从以下方面考滤优化:
1, 在设计数据库表的时候就要考虑到优化
2, 查询 sql 语句上的优化
3, 从数据库设计上进行结大框架的设计: 如分区, 分表, 分库
1, 在设计数据库表的时候就要考虑到优化
1, 尽可能使用 not null 定义字段, 避免 null 值字段出现, null 值会占用额外的索引空间
2, 使用固定长度的字段类型如 char 而不是 varchar
3, 添加索引, 在查询频繁的字段上加索引, 如在 where,group by, order by,on 中出现的字段加索引
4, 字符字段只建立前缀索引, 字符字段最好不要做主键
2, 查询 sql 语句上的优化
1, 不要使用 select * 查询, 将要查找的字段写出来
2, 使用 join 来代替子查询
3, 使用 limit 对查询结果的记录进行限定, 千万级别的数据太多, 后面的数据没必要查出来
4,OR 改写成 IN: 因为 OR 的效率是 n 级别, IN 的效率是 log(n)级别
5, 少使用触发器和函数, 可在应用程序代码实现
6, 也尽量少用 join
7, 尽量避免在 where 子句中使用!= 或 <> 操作符, 否则将引擎放弃使用索引而进行全表扫描
8, 列表数据不要拿全表的数据, 要使用 limit 来分页
来说说 MySQL 的引擎:
目前广泛使用的是 MyISAM 和 InnoDB 两种引擎:
MyISAM 引擎, MySQL5.1 之前版本默认引擎, 它的特点是: 不支持行锁, 不支持事务, 不支持外键
InnoDB 引擎, MySQL5.5 后默认引擎, 它的特点: 支持行锁, 采用 MVCC 来支持高并发, 支持事务, 支持外键, 不支持全文索引
分区:
分区我不太明白, 没怎么看懂
分表:
分表就是把一张超多数据的表, 分成多张表, 把一次查询, 分成多次查询, 然后把结果组合返回给用户.
分表: 又有两种方式, 分为垂直拆分和水平拆分, 通常以某个字段做拆分项, 比如以 id 字段拆分为 100 张表: 表名为 tableName_id%100
分表只适合开发初期做好分表处理, 不适合应用上线后再做修改, 成本太高.
分库:
分库: 就是把一个数据库分成多个, 然后做读写分离.
有钱的话, 使用其他方法, 阿里云数据库 POLARDB, 阿里云 OcenanBase (淘宝使用, 扛得住双十一), 阿里云 HybridDB for MySQL (原 PetaData), 腾讯云数据库: 腾讯云 DCDB 等等
另一种情况: 数据量过亿
数据量过亿只能使用传说中的大数据了.(做了这么多年开发, 从来没接触过这玩意, 可能都没进什么大公司的原因吧)
hadoop 家族,(具体怎么玩的暂时还不知道)
...
来源: http://www.bubuko.com/infodetail-2916020.html