`
ahzzhen2
  • 浏览: 19388 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

MySQL 百万数据优化实例(转)

    博客分类:
  • Java
 
阅读更多

 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

  2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

  select id from t where num is null

  可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

  select id from t where num=0

  3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

  4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

  select id from t where num=10 or num=20

  可以这样查询:

  select id from t where num=10

  union all

  select id from t where num=20

  5.in 和 not in 也要慎用,否则会导致全表扫描,如:

  select id from t where num in(1,2,3)

  对于连续的数值,能用 between 就不要用 in 了:

  select id from t where num between 1 and 3

  6.下面的查询也将导致全表扫描:

  select id from t where name like '%abc%'

  若要提高效率,可以考虑全文检索。

  7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:

  select id from t where num=@num <mailto:num=@num>

  可以改为强制查询使用索引:

  select id from t with(index(索引名)) where num=@num <mailto:num=@num>

  8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

  select id from t where num/2=100

  应改为:

  select id from t where num=100*2

  9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

  select id from t where substring(name,1,3)='abc'–name以abc开头的id

  select id from t where datediff(day,createdate,'2005-11-30')=0–‘2005-11-30’生成的id

  应改为:

  select id from t where name like 'abc%'

  select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

  10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

  11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

  12.不要写一些没有意义的查询,如需要生成一个空表结构:

  select col1,col2 into #t from t where 1=0

  这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:

  create table #t(…)

  13.很多时候用 exists 代替 in 是一个好的选择:

  select num from a where num in(select num from b)

  用下面的语句替换:

  select num from a where exists(select 1 from b where num=a.num)

  14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效

率起不了作用。

  15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

  16.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。

  17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

  18.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

  19.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

  20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

  21.避免频繁创建和删除临时表,以减少系统表资源的消耗。

  22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。

  23.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

  24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

  25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

  26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。

  27.与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。

  28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。

  29.尽量避免大事务操作,提高系统并发能力。

  30.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

分享到:
评论

相关推荐

    mysql优化小技巧之去除重复项实现方法分析【百万级数据】

    本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了...

    百万级数据库记录下的Mysql快速分页优化实例

    ### 百万级数据库记录下的MySQL快速分页优化实例 #### 概述 在处理大量数据时,如何高效地进行分页查询是一项重要的技术挑战。本文档将详细探讨当面对百万乃至千万级别数据记录时,如何优化MySQL的分页查询性能。...

    mysql5.7多实例部署

    五、MySQL 5.7 多实例部署的优化 * 使用经过优化后的 my.cnf 配置文件 * 使用 mysql.server 启动脚本 六、MySQL 5.7 多实例部署的管理 * 启动 MySQL 实例:/data/$Port/mysql.server start * 停止 MySQL 实例:/...

    mysql使用实例book-MySQL

    通过对本书的学习,你可以深入了解MySQL在实际工作中的应用,提升数据库管理、查询优化以及数据存储的能力。 首先,我们要理解MySQL的核心概念。MySQL是一种关系型数据库管理系统(RDBMS),它支持SQL语言,广泛...

    PHP+MySQL 网站开发全程实例附源码.rar

    《PHP+MySQL 网站开发全程实例》是一份涵盖了从基础到高级的PHP与MySQL数据库结合进行网站开发的教程,附带了源代码供学习者实践和参考。本教程旨在帮助初学者和有一定基础的开发者更深入地理解这两项技术,并通过...

    大型项目MySQL性能优化实例.pdf

    本实例分析了一份大型移动项目的MySQL数据库性能优化过程,提供了深入的技术细节和方法。 首先,MySQL体系架构的优化是确保数据库高性能的基础。体系架构的优化涵盖了存储引擎的选择。不同的存储引擎有着不同的特性...

    mysql三百万测试数据.zip

    总的来说,"mysql三百万测试数据.zip" 是一个宝贵的资源,它为MySQL的性能优化提供了丰富的实验素材,让我们能够更深入地理解和掌握数据库的性能调优技巧。通过实际操作和测试,可以提升我们的数据库管理技能,确保...

    MYSQL 优化常用方法实例教程

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,用于存储和管理大量数据。随着数据量的增长,数据库性能的优化变得至关重要。本教程将深入探讨MySQL优化的常用方法,帮助你提升数据库的运行效率,降低响应时间,...

    MySQL数据库基础实例教程(第2版)(微课版)-教学课件.zip

    MySQL数据库基础实例教程是针对初学者的一套系统性学习资源,尤其适合想要了解数据库管理和开发的人群。本教程分为多个章节,涵盖了从基础到进阶的各个关键领域,旨在通过实例教学来帮助学习者深入理解MySQL的核心...

    MYSQL连接数据库实例

    在本文中,我们将深入探讨如何连接到MySQL数据库,提供实例教程,以便更好地理解和实践。 首先,了解MySQL连接的基础知识至关重要。连接到MySQL数据库通常涉及以下四个核心元素: 1. **服务器地址(Host)**:这是...

    sql性能优化及实例

    减少数据访问,返回更少数据,减少交互次数,减少服务器CPU开销,利用更多资源。注意:这个是对《sql性能优化分享》的后期修改与补充。下载这个最新的就下载老的了。别下载重复了!!!

    php+mysql动态网站开发实例 源码

    它提供了丰富的内置函数,可以处理表单数据、生成动态页面内容、操作文件系统、发送邮件以及与各种数据库进行交互,包括MySQL。PHP的优势在于其易于学习、执行速度快以及跨平台性。 接下来是MySQL,它是世界上最受...

    java实现excel到mysql数据的导入实例

    以上就是Java实现Excel到MySQL数据导入的基本步骤。在提供的压缩包`Java_Excel_Writer_Mysql`中,可能包含了示例代码、数据库脚本和测试用的Excel文件。通过阅读和理解这些代码,你可以快速实现自己的功能,只需根据...

    mysql 性能优化与架构设计(word版)

    4. 分布式数据库:通过Sharding Key将数据分布到多个MySQL实例,如MyCat、ProxySQL等中间件可以帮助管理分布式环境。 5. 异步架构:采用异步处理模型,如使用消息队列,可以解耦服务,提高系统响应速度,并提供更好...

    mysql多实例

    MySQL多实例是指在同一台服务器上运行多个独立的MySQL服务,每个服务都拥有自己的配置、数据文件和日志,可以独立管理。这样的设置在资源充足且需要隔离不同业务场景或者提高数据库服务可用性的环境中非常常见。以下...

    MySQL技术大全:开发、优化与运维实战实例源代码.rar

    《MySQL技术大全:开发、优化与运维实战实例源代码》是一本深入探讨MySQL数据库系统的技术书籍,涵盖了开发、性能优化和运维等多个方面的实践内容。这本书的源代码包含了丰富的实例,帮助读者更好地理解和应用书中...

    MySQL数据库基础与实例教程 孔详盛 书本原代码

    在《MySQL数据库基础与实例教程》中,作者孔详盛深入浅出地讲解了MySQL的基础知识和实践应用,旨在帮助读者快速掌握这一重要的数据管理工具。 首先,我们要了解数据库的基本概念。数据库是一个组织和存储数据的系统...

Global site tag (gtag.js) - Google Analytics