mysql 3200万数据,优化分页查询

my.ini参数修改了下

Java代码  

  1. table_cache=512
  2. bulk_insert_buffer_size = 100M
  3. innodb_additional_mem_pool_size=30M
  4. innodb_flush_log_at_trx_commit=0
  5. innodb_buffer_pool_size=207M
  6. innodb_log_file_size=128M

innodb_flush_log_at_trx_commit默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电 池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统 挂了时才可能丢数据。对于事务要求很强,设置为0 是存在安全问题的

mysql创建表

Sql代码  

  1. CREATE TABLE `news` (
  2. `id` int(19) NOT NULL AUTO_INCREMENT,
  3. `title` varchar(30) DEFAULT NULL,
  4. `content` varchar(400) DEFAULT NULL,
  5. `type` varchar(30) DEFAULT NULL,
  6. PRIMARY KEY (`id`),
  7. UNIQUE KEY `PK_NEWS_ID` (`id`),
  8. KEY `INDEX_NEWS_ID_TYPE` (`id`,`type`),
  9. KEY `INDEX_NEWS_TYPE` (`type`)
  10. ) ENGINE=InnoDB AUTO_INCREMENT=1072779 DEFAULT CHARSET=utf8

java插入测试数据代码放到文章最后面

mysql5.5 支持 insert into mytable value (xxx,xxx....),(xxx,xxx....)...........插入多条记录,相比addBatch 好不到哪里,而且mysql数据包有限制,超大字符串对JVM来说也不好

测试结果300万插入只需要597秒

查询随着select字段增多会消耗更多时间,limit a,b 也会随着a的增大而加大查询时间。

现在数据已经添加到了至少3200万条数据,

几千万数据中只需0.001ms , in的速度是惊人的, 最主要也是因为加了索引,

可见复合索引带来性能的优势

这个表大约是三千多万条记录,综合一下2个最重要的速度最快查询 就是分页的查询语句


 

大表查询总结: 1 复合索引好好使用 2   in 要好好使用

上面的都是传统分页的,分页做下改进

1   当页面传到controller层有一个page对象,代表要查询的页数,那么我们的sql可以随着变化

start=(page-1)*pagesize+1  然后是where做限制 就是where加上 id >= start

如果表中增加了一个type=‘ios8‘ 因为ios8 的数据是从三千多万多条开始的,假设是32888888条记录,后面才增加type=‘ios8‘的记录,那么分页就可以加上   id >= start + 32888888

2   对于新闻类,老的数据分页是固定的,所以可以分表,新闻就要新闻

所以最新的新闻的分页好办,表里面弄几百页就够了,其他的数据放到一个老数据表里面,老数据表的存储引擎改成MyISAM

比如前500页就查询news的数据,后面的就查询oldnews1,oldnews2.....表的数据,对old表做一下策略每个old表的一种分类只允许有100000页的数据。

假设oldnew1表,是数据里面最先入进去的,是知道id的范围的,但是oldnews1表分页的页数是会变的

我们在老数据表每个表里面都增加一个page字段,存储页数,由于页数是会变动的,所以我们需要页码字段和数据倒着来,那么插入的时候就不会改动前面的页码的,我们知道有多少个老表。假设有10个老表

limit a,b,那么a就会大于 (news表的总页数*pagesize-news表的总条数+ 9*100000*pagesize),查询页码的时候就需要-100000+1,因为页码字段是倒着来的.

3  上面分表+页码策略做的话性能会明显的提升很多,但是表中有大字段而且字段超多始终会对性能产生影响,老新闻是不变的,可以做静态化处理,我们新增一个路径表urloldnew1,.....,只给一个id,page,url即可,查询的时候就用这样就可以让表的数据字段大大减少,不去查询老的原始数据表。

url是生成的静态文件地址,这需要静态化的时候进行二次加密,根据文件路径生成 加密码,然后根据加密码生成静态路径。

4   下面对单条新闻设计。

查询单条新闻:

这是经过加密的,后台要解密前台传递过来的字符串

如jkser896 _  89hhgii  _  oiy67hjk

根据字段表再次解密 java开发者     _        /news/old8/      1243546678

这样拼接路径就成了。

最后把java插入测试数据放到附件里

获取【下载地址】 java后台框架源码 springmvc mybatis

时间: 2024-10-08 17:40:43

mysql 3200万数据,优化分页查询的相关文章

sql优化之大数据量分页查询(mysql)

当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时就需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点. 谈优化前的准备工作 为了对下面列举的一些优化进行测试,需要使用已有的一张表作为实际例子. 表名:order_history. 描述:某个业务的订单历史表. 主要字段:unsigned int id,tinyint(4) int type. 字段情况:该表一共37个字段,不包含text等大型数据,最大为varchar(500

使用JDBC连接MySQL数据库--典型案例分析(八)----实现员工数据的分页查询

转载请注明:http://blog.csdn.net/uniquewonderq 问题: 使用JDBC连接Mysql数据库,实现对Emp表数据的分页查询功能. 方案: 对于较大的数据量,通常采用分页查询的方式.不同的数据库产品有不同的数据库级的分页查询策略.例如:Oracle通常使用rownum的方式:而Mysql使用limit的方式. Oracle采用rownum和子查询实现分页查询,SQL语句如下, select * from (select rownum rn,empno,ename,jo

MySQL两千万数据优化&迁移

最近有一张2000W条记录的数据表需要优化和迁移.2000W数据对于MySQL来说很尴尬,因为合理的创建索引速度还是挺快的,再怎么优化速度也得不到多大提升.不过这些数据有大量的冗余字段和错误信息,极不方便做统计和分析.所以我需要创建一张新表,把旧表中的数据一条一条取出来优化后放回新表: 一. 清除冗余数据,优化字段结构 2000W数据中,能作为查询条件的字段我们是预知的.所以将这部分数据单独创建新的字段,对于有规则的数据合理改变字段结构,比如身份证就是varchar(18).对于不重要的数据我们

php -- php读取sqlserver2005的数据实现分页查询

--php5.2 --sqlserver2005 php读取sqlserver多条数据时,有时因为数据太多,需要进行分页查询. 例如,按价格的顺序,读取同一类型的产品的第30到第48条记录 $startNum = 30; $endNum = 48;$type = '洗发水'; 如果php页面的编码是UTF-8,sqlserver是GBK的话, 要将$type进行转码, $type = iconv('UTF-8','GBK',$type); 接下来分页查询(数据表table1,构建临时表a),贴上

MySQL大数据量分页查询方法及其优化

方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N 适应场景: 适用于数据量较少的情况(元组百/千级) 原因/缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是从结果集的M位置处取出N条输出,其余抛弃. 方法2: 建立主键或唯一索引, 利用索引(假设每页10条) 语句样式: MySQL中,可用如下方法: SELECT * FRO

MySQL的limit用法和分页查询的性能分析及优化

申明:本博文转发于 点击链接跳转 一.limit用法在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table LIMIT [offset,] rows | `rows OFFSET offset ` (LIMIT offset, `length`)SELECT*FROM tablewhere condition1 = 0and condition2 = 0and condition3

MySQL数据优化总结-查询备忘录

一.优化分类 二.测试数据样例 参考mysql官方的sakina数据库. 三.使用mysql慢查询日志对有效率问题的sql进行监控 第一个,开启慢查询日志.第二个,慢查询日志存储位置.第三个,没有使用索引的也会记录到慢查询日志中.第四个,超过1秒之后的查询记录到慢查询日志中(通常设置100ms). 3.1.分析慢查询日志文件 3.1.1 tail命令 tail -50 /home/mysql/sql_log/mysql_slow.log,输入文件中的尾部内容,即末尾50行数据. 我们抽出其中一条

大数据oracle分页查询

ROWNUM 可能都知道ROWNUM只适用于小于或小于等于,如果进行等于判断,那么只能等于1,不能进行大于的比较. ROWNUM是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推. ROWNUM总是从1开始,不管当前的记录是否满足查询结果,ROWNUM返回的值都是1,如果这条记录的值最终满足所有的条件,那么ROWNUM会递加,下一条记录的ROWNUM会返回2,否则下一条记录的ROWNUM仍然返回1. 理解了这一点,就清楚为什么一般的ROWNUM大于某个

MySQL如何定位并优化慢查询sql

1.如何定位并优化慢查询sql a.根据慢日志定位慢查询sql SHOW VARIABLES LIKE '%query%'      查询慢日志相关信息 slow_query_log 默认是off关闭的,使用时,需要改为on 打开 slow_query_log_file 记录的是慢日志的记录文件 long_query_time 默认是10S,每次执行的sql达到这个时长,就会被记录 SHOW STATUS LIKE '%slow_queries%'  查看慢查询状态 Slow_queries 记