热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql生成了100w条文章数据(2G数据)做测试用

昨天写了个php程序,给mysql插入随机的文章数据,仿照真实文章,中文数据,主要是测试在100w级数量时查询上的优化及测试mysql内置的全文检索与其它类似全文检索引擎的差距等。总数据量:

昨天写了个php程序,给mysql插入随机的文章数据,仿照真实文章,中文数据,主要是测试在100w级数量时查询上的优化及测试mysql内置的全文检索与其它类似全文检索引擎的差距等。总数据量:article 101w左右  user表10w左右,总计占用硬盘2G左右

今天开始测试在海量数据查询时的优化手段

  1. 测试添加索引对数据查询的影响:
    sql语句:select * from article as article order by time limit 10;
    没有对time字段建立索引时查询所花时间:31.237657s
    新建time字段的索引,花掉近二分钟,建立了111298条索引,没有建立完phpmyadmin就timeout了。
    建立time索引后,同样的sql语句执行只花了:0.380957s,不过time索引没有建完,但是时间相差不大;
    总结:在关键字段的索引上,建与不建速度相差近100倍!
     
  2. 测试limit在不同的基数上的影响:
    sql语句:select * from article as article order by id limit  0,10
    当limit的基数为0时【limit  0,10】,执行时间:0.001557s
    当limit的基数为20000时【limit  20000,10】,,执行时间:0.572288s
    当limit的基数为100000时,执行时间:2.793380s
    当limit的基数为50W 时,执行时间:14.444422s
    当limit的基数为100W时,执行时间:28.270054s
    总结:在海量数据中要想查找比较靠后的数据时,要注意limit的基数,因为随着数据量的加大,查找时间继续增长!在取比较后面的数据时,可以通过desc方式把数据反向查找,以减少对前段数据的扫描,让limit的基数越小越好!
     
  3. 测试field为*或是id对查询速度的影响:
    sql语句:select id from article as article order by id limit 100000,10
    为了数据更真实,所以通过limit让sql执行时间长些,以便更容易看出区别
    当field为id时,执行时间:2.617519s
    当field为*时,执行时间:2.867721s
    总结:由数量可见,二者在sql执行时间上相差并不大,但是限定field可以大幅度的减少内存开支
     
  4. 测试limit限定结果与between限定结果上的区别:
    当用limit          select * from article as article order by id limit 1000000,10      [31.163212s]
    当用between  select * from article as article where id between 1000000 and 1000010 order by id       [0.001433s]
    总结:between 限定上比limit快太多了,所以当在海量数据访问时,建议用between或是where把limit替换掉,但是between也有缺陷,如果id中间有断行或是中间部分id不读取的话,总读取的数量会少于预计数量!
     
  5. 测试left join对读取数据的影响
    user表,数据为100000条
    select id from article as article order by id limit 500000      [14.980397s]
    select article.id from article as article left join user as user on user.uid=article.uid order by article.id,user.username limit 500000      [60.488099s]
    总结:当数据量比较大时,用left join做连接是非常慢的,速度是查单表的4倍多,所以如果在大数据量的情况下,如果要实现刚实现用户表与文章表的连表功能,还是把全部的会员数据预先存入memcache等内存缓存中,10万条用户数据也不过5m不到,用户更新资料或登陆时,把用户的数据更新入memcache的指定用户中就ok了。这样速度就快了!

转自:http://www.phpd.cn/archives/230/


推荐阅读
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 达人评测 酷睿i5 12450h和锐龙r7 5800h选哪个好 i512450h和r75800h对比
    本文介绍了达人评测酷睿i5 12450h和锐龙r7 5800h选哪个好的相关知识,包括两者的基本配置和重要考虑点。希望对你在选择时提供一定的参考价值。 ... [详细]
  • 本文介绍了在MySQL8.0中如何查看性能并解析SQL执行顺序。首先介绍了查询性能工具的开启方法,然后详细解析了SQL执行顺序中的每个步骤,包括from、on、join、where、group by、having、select distinct、union、order by和limit。同时还介绍了虚拟表的概念和生成过程。通过本文的解析,读者可以更好地理解MySQL8.0中的性能查看和SQL执行顺序。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文主要介绍了MySQL中子查询的基本用法和三种用法,包括生成参考值、内层查询与外层查询的比较操作以及使用事件号在成绩表中找到学生的分数记录。通过详细解析子查询的实例,帮助读者更好地理解和应用子查询。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 数据库锁的分类和应用
    本文介绍了数据库锁的分类和应用,包括并发控制中的读-读、写-写、读-写/写-读操作的问题,以及不同的锁类型和粒度分类。同时还介绍了死锁的产生和避免方法,并详细解释了MVCC的原理以及如何解决幻读的问题。最后,给出了一些使用数据库锁的实际场景和建议。 ... [详细]
  • 本文介绍了在Ubuntu系统中清理残余配置文件和无用内容的方法,包括清理残余配置文件、清理下载缓存包、清理不再需要的包、清理无用的语言文件和清理无用的翻译内容。通过这些清理操作可以节省硬盘空间,提高系统的运行效率。 ... [详细]
author-avatar
mobiledu2502883257
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有