尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Mysql 给你100万条数据的一张表,你将如何分页查询优化?
1.两种查询引擎查询速度myIsam 引擎 InnoDB 中不保存表的具体行数也就是说执行select count(*) from table时InnoDB要扫描一遍整个表来计算有多少行。MyISAM只要简单的读出保存好的行数即可。注意的是当count(*)语句包含 where条件时两种表的操作有些不同InnoDB类型的表用count(*)或者count(主键)加上where col 条件。其中col列是表的主键之外的其他具有唯一约束索引的列。这样查询时速度会很快。就是可以避免全表扫描。总结mysql 在300万条数据myisam引擎情况下使用 count(*) 进行数据总数查询包含条件正确设置索引运行时间正常。对于经常进行读取的数据我们建议使用myIsam引擎。2.百万数据下mysql分页问题在开发过程中我们经常会使用分页核心技术是使用limit进行数据的读取在使用limit进行分页的测试过程中得到以下数据select * from news order by id desc limit 0,10 耗时0.003秒 select * from news order by id desc limit 10000,10 耗时0.058秒 select * from news order by id desc limit 100000,10 耗时0.575秒 select * from news order by id desc limit 1000000,10 耗时7.28秒我们惊讶的发现mysql在数据量大的情况下分页起点越大查询速度越慢100万条起的查询速度已经需要7秒钟。这是一个我们无法接受的数值改进方案 1select * from news where id (select id from news order by id desc limit 1000000, 1)order by id desc limit 0,10查询时间 0.365秒提升效率是非常明显的原理是什么呢我们使用条件对id进行了筛选在子查询 (select id from news order by id desc limit 1000000, 1) 中我们只查询了id这一个字段比起select * 或 select 多个字段 节省了大量的查询开销改进方案2适合id连续的系统速度极快select * from news where id between 1000000 and 1000010 order by id desc不适合带有条件的、id不连续的查询。速度非常快3. 百万数据下mysql条件查询、分页查询的注意事项接上一节我们加上查询条件select id from news where cate 1 order by id desc limit 500000 ,10查询时间 20 秒好恐怖的速度利用上面方案进行优化select * from news where cate 1 and id (select id from news where cate 1 order by id desc limit 500000,1 ) order by id desc limit 0,10查询时间 15 秒优化效果不明显条件带来的影响还是很大在这样的情况下无论我们怎么去优化sql语句就无法解决运行效率问题。那么换个思路建立一个索引表只记录文章的id、分类信息我们将文章内容这个大字段分割出去。表 news2 [ 文章表 引擎 myisam 字符集 utf-8 ]-------------------------------------------------id int 11 主键自动增加cate int 11 索引在写入数据时将2张表同步查询是则可以使用news2 来进行条件查询select * from news where cate 1 and id (select id from news2 where cate 1 order by id desc limit 500000,1 ) order by id desc limit 0,10注意条件 id 后面使用了news2 这张表运行时间 1.23秒我们可以看到运行时间缩减了近20倍数据在10万左右是查询时间可以保持在0.5秒左右是一个逐步接近我们能够容忍的值但是1秒对于服务器来说依然是一个不能接受的值还有什么可以优化的办法吗我们尝试了一个伟大的变化将 news2 的存储引擎改变为innodb执行结果是惊人的select * from news where cate 1 and id (select id from news2 where cate 1 order by id desc limit 500000,1 ) order by id desc limit 0,10只需要 0.2秒非常棒的速度。4MySQL性能优化的一些经验a.为查询优化你的查询大多数的MySQL服务器都开启了查询缓存。这是提高性能最有效的方法之一而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候这些查询结果会被放到一个缓存中这样后续的相同的查询就不用操作表而直接访问缓存结果了。这里最主要的问题是对于程序员来说这个事情是很容易被忽略的。因为我们某些查询语句会让MySQL不使用缓存。请看下面的示例// 查询缓存不开启 $r mysql_query(SELECT username FROM user WHERE signup_date CURDATE()); // 开启查询缓存 $today date(Y-m-d); $r mysql_query(SELECT username FROM user WHERE signup_date $today);上面两条SQL语句的差别就是 CURDATE() MySQL的查询缓存对这个函数不起作用。所以像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存因为这些函数的返回是会不定的易变的。所以你所需要的就是用一个变量来代替MySQL的函数从而开启缓存。b.学会使用EXPLAIN使用EXPLAIN关键字可以让你知道MySQL是如何处理你的SQL语句的。select id, title, cate from news where cate 1发现查询缓慢然后在cate字段上增加索引则会加快查询c.当只要一行数据时使用LIMIT 1当你查询表的有些时候只需要一条数据请使用 limit 1。d.正确的使用索引索引并不一定就是给主键或是唯一的字段。如果在你的表中有某个字段你总要会经常用来做搜索、拍下、条件那么请为其建立索引吧。e.不要ORDER BY RAND()效率很低的一种随机查询。f.避免SELECT *从数据库里读出越多的数据那么查询就会变得越慢。并且如果你的数据库服务器和WEB服务器是两台独立的服务器的话这还会增加网络传输的负载。必须应该养成一个需要什么就取什么的好的习惯。g.使用 ENUM 而不是 VARCHARENUM 类型是非常快和紧凑的。在实际上其保存的是 TINYINT但其外表上显示为字符串。这样一来用这个字段来做一些选项列表变得相当的完美。如果你有一个字段比如“性别”“国家”“民族”“状态”或“部门”你知道这些字段的取值是有限而且固定的那么你应该使用 ENUM 而不是 VARCHAR。h.使用 NOT NULL除非你有一个很特别的原因去使用 NULL 值你应该总是让你的字段保持 NOT NULL。这看起来好像有点争议请往下看。首先问问你自己“Empty”和“NULL”有多大的区别如果是INT那就是0和NULL如果你觉得它们之间没有什么区别那么你就不要使用NULL。你知道吗在 Oracle 里NULL 和 Empty 的字符串是一样的)不要以为 NULL 不需要空间其需要额外的空间并且在你进行比较的时候你的程序会更复杂。 当然这里并不是说你就不能使用NULL了现实情况是很复杂的依然会有些情况下你需要使用NULL值。
RELATED

相关推荐

架构设计:把 GDAL “藏“ 起来

架构设计:把 GDAL “藏“ 起来

API 风格不统一。 不同格式的数据打开方式差异很大。Shapefile 用 .shp 文件路径,FileGDB 用 .gdb 目录路径,PostGIS 用连接字符串——每种格式要写的代码都不太一样。 格式差异暴露给调用方。 读 Shapefile 和读 GeoJSON 的 API 表面相似,但…

📅 2026/10/8 1:11:59
互联网公司指南 上海篇: 字节跳动——从新人入职到资深发展的全景透视

互联网公司指南 上海篇: 字节跳动——从新人入职到资深发展的全景透视

1. 字节跳动上海研发中心概况字节跳动在上海的布局堪称除北京总部外的第二大研发中心,这里汇聚了飞书、Data、搜索、安全与风控、游戏、国际化短视频、教育、AI-Lab、互娱、电商等多元业务线。2014年设立上海分部至今,员工规模已突破6000人,其…

📅 2026/10/4 23:00:17
从零搭建Unreal Engine Pixel Streaming:云端渲染与WebRTC实时交互全解析

从零搭建Unreal Engine Pixel Streaming:云端渲染与WebRTC实时交互全解析

1. 项目概述:为什么我们需要Pixel Streaming?如果你是一个Unreal Engine的开发者,尤其是做过一些高保真度、对硬件要求苛刻的项目,比如一个写实风格的开放世界游戏,或者一个需要实时渲染复杂模型的工业仿真应用&#x…

📅 2026/9/12 5:03:55
MORE NEWS

更多资讯

📰

JJencode编码解密工具:前端JS代码混淆与源码还原实操

做前端的人大概都遇到过这种场面:交付给客户的是一个纯前端跑的小工具,或者一个 H5 小游戏,代码打包压缩完往服务器一放,懂行的人按 F12 就能把逻辑看个七七八八,改个变量名、换个皮肤就成他自己的了。这时候就会有人翻…

📰

OpenClaw与LINE集成提升养虾业沟通效率

1. OpenClaw与LINE集成的核心价值OpenClaw作为一款多平台即时通讯聚合工具,其与LINE的深度整合为养虾行业带来了前所未有的沟通效率提升。传统养虾场管理中,技术人员、养殖工人、销售团队之间的信息传递往往存在滞后性,而通过OpenClaw接入LIN…

📰

Java record 规范构造器能否被反序列化或反射绕过

问题现象 record 类型通常靠规范构造器来把守不变式,比如禁止名字为空: public record User(String name) {public User {if (name == null || name

📰

Unity Package Manager刷新错误排查与解决方案

1. Unity Package Manager刷新资源报错问题解析最近在Unity开发过程中,Package Manager提示"Error Refreshing Asset"的问题困扰了不少开发者。作为Unity项目依赖管理的核心组件,Package Manager一旦出现问题,轻则影响资源加载&…

📰

淘宝商品详情API开发实战与性能优化指南

1. 淘宝商品详情API核心功能解析淘宝开放平台的taobao.item.get接口是电商开发者最常调用的核心接口之一,它提供了获取单个商品完整信息的能力。这个接口的独特之处在于它能返回商品的基础信息、SKU数据、促销信息等全维度数据,且响应速度控制在200ms以内…

📰

MIUI 11老机型:TWRP永久固定与无密data分区实战

1. 先把原理捋清楚:MIUI 11 的恢复分区与 data 加密 手上还留着一台 MIUI 11 时代的老机器,扔了可惜,当备用机又嫌系统臃肿——这种场景下,刷入 TWRP 并做成无密 data 分区,几乎是所有后续折腾的前提。TWRP 是第三方恢…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬