mysql千万级数据大表该如何优化?
1.数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节;
2.数据项:是否有大字段,那些字段的值是否经常被更新;
3.数据查询SQL条件:哪些数据项的列名称经常出现在WHERE、GROUP BY、ORDER BY子句中等;
4.数据更新类SQL条件:有多少列经常出现UPDATE或DELETE 的WHERE子句中;
5.SQL量的统计比,如:SELECT:UPDATE+DELETE:INSERT=多少?
6.预计大表及相关联的SQL,每天总的执行量在何数量级?
7.表中的数据:更新为主的业务 还是 查询为主的业务
8.打算采用什么数据库物理服务器,以及数据库服务器架构?
9.并发如何?
10.存储引擎选择InnoDB还是MyISAM?
大致明白以上10个问题,至于如何设计此类的大表,应该什么都清楚了!
至于优化若是指创建好的表,不能变动表结构的话,那建议InnoDB引擎,多利用点内存,减轻磁盘IO负载,因为IO往往是数据库服务器的瓶颈
另外对优化索引结构去解决性能问题的话,建议优先考虑修改类SQL语句,使他们更快些,不得已只靠索引组织结构的方式,当然此话前提是,
索引已经创建的非常好,若是读为主,可以考虑打开query_cache,
以及调整一些参数值:sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_size
其他人建议:
1. 索引, 避免扫描,基于主键的查找,上亿数据也是很快的;
2. 反范式化设计,以空间换时间,避免join,有些join操作可以在用代码实现,没必要用数据库来实现;
相关推荐
-
MySQL命令行中给表添加一个字段(字段名、是否为空、默认值)
先看一下最简单的例子,在test中,添加一个字段,字段名为birth,类型为date类型. mysql> alter table test add column birth date; Query OK, 0 rows affected (0.36 sec) Records: 0 Duplicates: 0 Warnings: 0 查询一下数据,看看结果: mysql> select * from test; +------+--------+-----------------------
-
MySQL 删除大表的性能问题解决方案
微博上讨论MySQL在删除大表engine=innodb(30G+)时,如何减少MySQL hang的时间,现做一下简单总结: 当buffer_pool很大的时候(30G+),由于删除表时,会遍历整个buffer pool来清理数据,会导致MySQL hang住,解决的办法是: 1.当innodb_file_per_table=0的时候,以上不是问题,因为采用共享表空间的时候,该表所占用的空间不会被删除,buffer pool中的相关页不会 被discard. 2.当innodb_file_pe
-
MySql创建带解释的表及给表和字段加注释的实现代码
1 创建带解释的表 CREATE TABLE groups( gid INT PRIMARY KEY AUTO_INCREMENT COMMENT '设置主键自增', gname VARCHAR(200) COMMENT '列注释' ) COMMENT='表注释'; 2 修改现有列,加上解释 alter table test_data modify column test_desc int comment 'xxxx'; 3 修改现有表,加上解释 ALTER TABLE test_data
-
MySQL大表中重复字段的高效率查询方法
MySQL大表重复字段应该如何查询到呢?这是很多人都遇到的问题,下面就教您一个MySQL大表重复字段的查询方法,供您参考. 数据库中有个大表,需要查找其中的名字有重复的记录id,以便比较.如果仅仅是查找数据库中name不重复的字段,很容易 复制代码 代码如下: SELECT min(`id`),`name` FROM `table` GROUP BY `name`; 但是这样并不能得到说有重复字段的id值.(只得到了最小的一个id值)查询哪些字段是重复的也容易 复制代码 代码如下: SELEC
-
MySQL中大数据表增加字段的实现思路
前言 增加字段相信大家应该都不陌生,随手就可以写出来,给 MySQL 一张表加字段执行如下 sql 就可以了: ALTER TABLE tbl_tpl ADD title(255) DEFAULT '' COMMENT '标题' AFTER id; 但是线上的一张表如果数据量很大呢,执行加字段操作就会锁表,这个过程可能需要很长时间甚至导致服务崩溃,那么这样操作就很有风险了. 那么,给 MySQL 大表加字段的思路如下: ① 创建一个临时的新表,首先复制旧表的结构(包含索引) create tab
-
MYSQL数据库中的现有表增加新字段(列)
复制代码 代码如下: ALTER TABLE `数据库名`.`表名` ADD COLUMN `PROCID` VARCHAR(6) DEFAULT '' AFTER `PPIDChanged`; --在MYSQL中,如果是表名,数据库名,列名,在你增加,修改,更新的时候都需要使用ESC键盘下的重音符号,才可以添加,相应的列名或者更新修改. 当然现在大多都是用phpmyadmin或mysql图形化操作工具,更方法,这样的是临时使用的,或没有图形界面的方法.大家可以使用上述的图形化工具操作. 下面推
-
MySQL修改表一次添加多个列(字段)和索引的方法
MySQL修改表一次添加多个列(字段) ALTER TABLE table_name ADD func varchar(50), ADD gene varchar(50), ADD genedetail varchar(50); MySQL修改表一次添加多个索引 ALTER TABLE table_name ADD INDEX idx1 ( `func`), ADD INDEX idx2 ( `func`,`gene`), ADD INDEX idx3( `genedetail`); 以上这篇
-
mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法
需求:把一个表某个字段内容复制到另一张表的某个字段. 实现sql语句1: 复制代码 代码如下: UPDATE file_manager_folder f1LEFT OUTER JOIN file_manager_folder f2 ON f1.name = f2.name AND f2.parentId = 54SET f1.parentId = 54 WHERE f2.name IS NULL AND f1.id IN (1,2,3); 实现sql语句2: 复制代码 代码如下: upd
-
mysql中向表中某字段追加字符串的方法
Update `表名` SET title = CONCAT(title,'MV') where articleid=3487 and title not like '%v'
-
MySQL表字段设置默认值(图文教程及注意细节)
环境 MySQL 5.1 + 命令行工具 问题 MySQL表字段设置默认值 解决 复制代码 代码如下: --SQL: CREATE TABLE test( i_a int NOT NULL DEFAULT 1, ts_b timestamp NOT NULL DEFAULT NOW(), c_c char(2) NOT NULL DEFAULT '1' ); --以下SQL不合法 --time_d time NOT NULL DEFAULT CURTIME(), --date_e date NO
随机推荐
- JS实现浏览器打印、打印预览示例
- Delphi 中内存映射对于大文件的使用
- 浅谈Vue父子组件和非父子组件传值问题
- Append、Debug、Diskcomp命令的使用说明
- ASP.NET使用gridview获取当前行的索引值
- PHP调用.NET的WebService 简单实例
- 浅析PHP7新功能及语法变化总结
- Python基于pygame实现的弹力球效果(附源码)
- asp.net创建XML文件的方法小结
- C++如何调用matlab函数
- 浅析Java.IO输入输出流 过滤流 buffer流和data流
- jQuery操作input值的各种方法总结
- Lua脚本自动生成APK包
- jquery实现表格隔行换色效果
- JS实现根据用户输入分钟进行倒计时功能
- Windows Server 2003探究
- C语言 位段的详细介绍
- Java Web使用Html5 FormData实现多文件上传功能
- 在JavaScript中使用JSON数据
- 基于jquery实现的定时显示与隐藏div广告的实现代码