搜档网
当前位置:搜档网 › mysql分页原理和高效率的mysql分页查询语句_Mysql

mysql分页原理和高效率的mysql分页查询语句_Mysql

mysql分页原理和高效率的mysql分页查询语句_Mysql
mysql分页原理和高效率的mysql分页查询语句_Mysql

解析

MySQL

在同一台机器上运行多个PHP mysqli

mysql

Mysql

有关

Mysql

mysql

如何恢复

QQ空间新浪微博腾讯微博搜狐微博人人网开心网百度搜藏更多1

sql语句(mysql优化)绝对经典

sql语句(mysql优化)绝对经典 误区1:count(1)和count(primary_key) 优于count(*) 很多人为了统计记录条数,就使用count(1) 和count(primary_key) 而不是count(*) ,他们认为这样性能更好,其实这是一个误区。对于有些场景,这样做可能性能会更差,应为数据库对count(*) 计数操作做了一些特别的优化。 误区2:count(column) 和count(*) 是一样的 这个误区甚至在很多的资深工程师或者是DBA 中都普遍存在,很多人都会认为这是理所当然的。实际上,count(column) 和count(*) 是一个完全不一样的操作,所代表的意义也完全不一样。count(column) 是表示结果集中有多少个column字段不为空的记录,count(*) 是表示整个结果集有多少条记录 误区3:select a,b from … 比select a,b,c from …可以让数据库访问更少的数据量 这个误区主要存在于大量的开发人员中,主要原因是对数据库的存储原理不是太了解。实际上,大多数关系型数据库都是按照行(row)的方式存储,而数据存取操作都是以一个固定大小的IO单元(被称作block 或者page)为单位,一般为4KB,8KB… 大多数时候,每个IO单元中存储了多行,每行都是存储了该行的所有字段(lob等特殊类型字段除外)。 所以,我们是取一个字段还是多个字段,实际上数据库在表中需要访问的数据量其实是一样的。当然,也有例外情况,那就是我们的这个查询在索引中就可以完成,也就是说当只取a,b两个字段的时候,不需要回表,而c这个字段不在使用的索引中,需要回表取得其数据。在这样的情况下,二者的IO量会有较大差异。(覆盖索引) 误区4:order by 一定需要排序操作 我们知道索引数据实际上是有序的,如果我们的需要的数据和某个索引的顺序一致,而且我们的查询又通过这个索引来执行,那么数据库一般会省略排序操作,而直接将数据返回,因为数据库知道数据已经满足我们的排序需求了。实际上,利用索引来优化有排序需求的SQL,是一个非常重要的优化手段。延伸阅读:MySQL ORDER BY 的实现分析,MySQL 中GROUP BY 基本实现原理以及MySQL DISTINCT 的基本实现原理。(order by null)

MySQL5.1性能优化方案

MySQL5.1性能优化方案 1.平台数据库 1.1.操作系统 Red Hat Enterprise Linux Server release 5.4 (Tikanga) ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped 32位Linux服务器,单独作为MySQL服务器使用。 1.2.M ySQL 系统使用的是MySQL5.1,最新的MySQL5.5较之老版本有了大幅改进。主要体现在以下几个方面: 1)默认存储引擎更改为InnoDB InnoDB作为成熟、高效的事务引擎,目前已经广泛使用,但MySQL5.1之前的版本默认引擎均为MyISAM,此次MySQL5.5终于将默认数据库存储引擎改为InnoDB,并且引进了Innodb plugin 1.0.7。此次更新对数据库的好处是显而易见的:InnoDB的数据恢复时间从过去的一个甚至几个小时,缩短到几分钟(InnoDB plugin 1.0.7,InnoDB plugin 1.1,恢复时采用红-黑树)。InnoDB Plugin 支持数据压缩存储,节约存储,提高内存命中率,并且支持adaptive flush checkpoint, 可以在某些场合避免数据库出现突发性能瓶颈。 Multi Rollback Segments:原来InnoDB只有一个Segment,同时只支持1023的并发。现已扩充到128个Segments,从而解决了高并发的限制。 2)多核性能提升

mysql性能优化-慢查询分析、优化索引和配置

mysql性能优化-慢查询分析、优化索引和配置目录 一、优化概述 二、查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三、配置优化 1) max_connections 2) back_log 3) interactive_timeout 4) key_buffer_size 5) query_cache_size 6) record_buffer_size 7) read_rnd_buffer_size 8) sort_buffer_size 9) join_buffer_size 10) table_cache 11) max_heap_table_size 12) tmp_table_size

13) thread_cache_size 14) thread_concurrency 15) wait_timeout 一、优化概述 MySQL数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候。磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应用分布在网络上,那么查询量相当大的时候那么平瓶颈就会出现在网络上,我们可以用mpstat, iostat, sar和vmstat来查看系统的性能状态。 除了服务器硬件的性能瓶颈,对于MySQL系统本身,我们可以使用工具来优化数据库的性能,通常有三种:使用索引,使用EXPLAIN分析查询以及调整MySQL的内部配置。 二、查询与索引优化分析 在优化MySQL时,通常需要对数据库进行分析,常见的分析手段有慢查询日志,EXPLAIN 分析查询,profiling分析以及show命令查询系统状态及系统变量,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。 1 性能瓶颈定位 Show命令 我们可以通过show命令查看MySQL状态及变量,找到系统的瓶颈: Mysql> show status ——显示状态信息(扩展show status like ‘XXX’) Mysql> show variables ——显示系统变量(扩展show variables like ‘XXX’) Mysql> show innodb status ——显示InnoDB存储引擎的状态 Mysql> show processlist ——查看当前SQL执行,包括执行状态、是否锁表等

MySQL大数据量的查询提高性能优化

最近一段时间参与的项目要操作百万级数据量的数据,普通SQL查询效率呈直线下降,而且如果where中的查询条件较多时,其查询速度简直无法容忍。之前数据量小的时候,查询语句的好坏不会对执行时间有什么明显的影响,所以忽略了许多细节性的问题。 经测试对一个包含400多万条记录的表执行一条件查询,其查询时间竟然高达40几秒,相信这么高的查询延时,任何用户都会抓狂。因此如何提高sql语句查询效率,显得十分重要。以下是结合网上流传比较广泛的几个查询语句优化方法: 基本原则:数据量大的时候,应尽量避免全表扫描,应考虑在where 及order by 涉及的列上建立索引,建索引可以大大加快数据的检索速度。但是,有些情况索引是不会起效的,因此,需要下面的做法进行优化: 1、应尽量避免在where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 2、应尽量避免在where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3、尽量避免在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 4、下面的查询也将导致全表扫描:

千万级的mysql数据库与优化方法

千万级的mysql数据库与优化方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引。 2.应尽量避免在where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: Sql代码 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: Sql代码 3.应尽量避免在where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 4.应尽量避免在where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:Sql代码 可以这样查询: Sql代码 5.in 和not in 也要慎用,否则会导致全表扫描,如: 对于连续的数值,能用between 就不要用in 了: 6.下面的查询也将导致全表扫描: Sql代码

若要提高效率,可以考虑全文检索。 7.如果在where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描: Sql代码 可以改为强制查询使用索引: 8.应尽量避免在where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如: 应改为: 9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:Sql代码 应改为: 10.不要在where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。 11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。 12.不要写一些没有意义的查询,如需要生成一个空表结构:

Mysql千万级别数据优化方案总结

Mysql千万级别数据优化方案 目录 目录 (1) 一、目的与意义 (2) 1)说明 (2) 二、解决思路与根据(本测试表中数据在千万级别) (2) 1)建立索引 (2) 2)数据体现(主键非索引,实际测试结果其中fid建立索引) (2) 3)MySQL分页原理 (2) 4)经过实际测试当对表所有列查询时 (2) 三、总结 (3) 1)获得分页数据 (3) 2)获得总页数:创建表记录大数据表中总数通过触发器来维护 (3)

一、目的与意义 1)说明 在MySql单表中数据达到千万级别时数据的分页查询结果时间过长,对此进行优达 到最优效果,也就是时间最短;(此统计利用的jdbc连接,其中fid为该表的主键;) 二、解决思路与根据(本测试表中数据在千万级别) 1)建立索引 优点:当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜 索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记 录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是 在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索 引中的ROWID(相当于页码)快速找到表中对应的记录。 缺点:当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降 低了数据的维护速度。 2)数据体现(主键非索引,实际测试结果其中fid建立索引) 未创建索引:SELECT fid from t_history_data LIMIT 8000000,10结果:13.396s 创建索引:SELECT fid from t_history_data LIMIT 8000000,10结果:2.896s select*fromt_history_datawherefidin (任意十条数据的id )结果:0.141s 首先通过分页得到分页的数据的ID,将ID拼接成字符串利用SQL语句 select * from table where ID in (ID字符串)此语句受数据量大小的影响比较小 (如上测试); 3)MySQL分页原理 MySQL的limit工作原理就是先读取n条记录,然后抛弃前n条,读m条想要 的,所以n越大,性能会越差。 优化前SQL: SELECT * FROM v_history_data LIMIT 5000000, 1010.961s 优化后SQL: SELECT * FROM v_history_data INNER JOIN (SELECT fid FROM t_history_data LIMIT 5000000, 10) a USING (fid)1.943s 分别在于,优化前的SQL需要更多I/O浪费,因为先读索引,再读数据,然后 抛弃无需的行。而优化后的SQL(子查询那条)只读索引(Cover index)就可以了, 然后通过member_id读取需要的列 4)经过实际测试当对表所有列查询时 select * from table 会比select (所有列名)from table 快些(以查询8000000

MySQL数据库查询优化技术

MySQL数据库查询优化技术 MySQL是高效能高稳定的开源数据库产品,由于其超低成本和操作简易便利,在互联网等行业被广泛使用,几乎99%以上的网站都乐于采用mysql作为后台数据库,自从被Oracle收购后,Mysql更是从站长们的宠儿一举成为企业级应用的红人。在当今灸手可热的BAT,Mysql被大量使用。对于想进入互联网行业发展的数据库工程师和DBA们,熟练的Mysql技术无疑是一块很好的敲门砖。炼数成金在过去已经成功举办多种数据库课程,覆盖Oracle,DB2和多种NoSQL数据库,现在再推出MySQL系列,更加丰富了课程线路,也希望可以为大家带来更多学习知识提升价值的机会。 公益性培训课程: 《MySQL数据库查询优化技术》课程概述: 该课程通过15次课程,系统地讲解MySQL数据库的查询优化技术 课程语言:SQL 课程大纲: 第1课数据库与关系代数 综述数据库、关系代数、查询优化技术 综述数据库调优技术 预计时间1小时 第2课数据库查询优化技术总揽 综述查询优化技术范围,包括查询重用、查询重写规则、查询算法优化、并行查询优化等 综述逻辑查询优化,包括子查询的优化、视图重写、等价谓词重写、条件化简、连接消除、非SPJ的优化等 综述逻辑物理优化,包括单表扫描算法、两表连接算法、多表连接算法、基于代价的算法等 初步理解MySQL的查询执行计划。 预计时间1小时

第3课查询优化技术理论与MySQL实践(一)------子查询的优化(一) 第4课查询优化技术理论与MySQL实践(二)------子查询的优化(二) 从理论看,子查询包括的内容和范围,建立清晰的概念 从实践看,MySQL的子查询优化技术的内容和范围,明确掌握子查询优化手段预计时间2小时,每小时一个课程段(子查询是SQL查询优化的重点内容,务必掌握好) 第5课查询优化技术理论与MySQL实践(三)------视图重写与等价谓词重写什么是视图重写?哪些类型的视图可以被优化?MySQL是怎么优化视图的?从而明白在MySQL中怎么写与视图相关的查询语句才能有好的效果? 什么是等价谓词重写?MySQL中怎么写WHERE子句有利于提高查询效率? 预计时间1小时 第6课查询优化技术理论与MySQL实践(四)------条件化简 什么是条件化简?MySQL中对什么样的条件自动进行优化?如何写出可利用索引的条件语句? 预计时间1小时 第7课查询优化技术理论与MySQL实践(五)------外连接消除、嵌套连接消除与连接消除 连接方式有些什么类型?不同类型的连接又是怎么优化的?外连接优化的条件是什么?MySQL中怎么写出可优化的连接语句?MySQL是否支持嵌套连接消除?MySQL是否支持连接消除?MySQL中书写SQL连接查询语句时的优化技巧。 预计时间1小时 第8课查询优化技术理论与MySQL实践(六)------数据库的约束规则与语义优化 数据库的参照完整性(CHECK t NULL等)。什么是语义优化?MySQL是否支持语义优化?怎么利用语义优化的思路人工进行SQL语句的优化? 预计时间1小时 第9课查询优化技术理论与MySQL实践(七)------非SPJ的优化

优化MySQL数据库性能的几个好方法

1、选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。 另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。 对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。 2、使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,如下所示: DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo ) 使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,有些情况下,子查询可以被更有效率的连接(JOIN).. 替代。例如,假设我们要将所有没有订单记录的用户取出来,可以用下面这个查询完成:

万字总结:学习MySQL优化原理,这一篇就够了!

万字总结:学习MySQL优化原理,这一篇就够了! Java开源分享 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必。因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用。 MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器。下图展示了MySQL的逻辑架构图。 MySQL逻辑架构整体分为三层,最上层为客户端层,并非MySQL所独有,诸如:连接处理、授权认证、安全等功能均在这一层处理。 MySQL大多数核心服务均在中间这一层,包括查询解析、分析、优化、缓存、内置函数(比如:时间、数学、加密等函数)。所有的跨存储引擎的功能也在这一层实现:存储过程、触发器、视图等。最下层为存储引擎,其负责MySQL中的数据存储和提取。和Linux下的文件系统类似,每种存储引擎都有其优势和劣势。中间的服务层通过API与存储引擎通信,这些API接口屏蔽了不同存储引擎间的差异。 MySQL查询过程

我们总是希望MySQL能够获得更高的查询性能,最好的办法是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,就会发现:很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。 当向MySQL发送一个请求的时候,MySQL到底做了些什么呢? MySQL查询过程 客户端/服务端通信协议 MySQL客户端/服务端通信协议是“半双工”的:在任一时刻,要么是服务器向客户端发送数据,要么是客户端向服务器发送数据,这两个动作不能同时发生。一旦一端开始发送消息,另一端要接收完整个消息才能响应它,所以我们无法也无须将一个消息切成小块独立发送,也没有办法进行流量控制。 客户端用一个单独的数据包将查询请求发送给服务器,所以当查询语句很长的时候,需要设置max_allowed_packet参数。但是需要注意的是,如果查询实在是太大,服务端会拒绝接收更多数据并抛出异常。 与之相反的是,服务器响应给用户的数据通常会很多,由多个数据包组成。但是当服务器响应客户端请求时,客户端必须完整的接收整个返回结果,而不能简单的只取前面几条结果,然后让服务器停止发送。因而在实际开发中,尽量保持查询简单且只返回必需的数据,减小通信间数据包的大小和数量是一个非常好的习惯,这也是查询中尽量避免使用SELECT *以及加上LIMIT限制的原因之一。 查询缓存

mysql的性能检查和调优

一、识别有问题的查询语句 processlist命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令。 1. 进入m ysql/bin目录下输入mysqladmin processlist; 2. 启动m ysql,输入show processlist; 如果有SUPER 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程)。 得到数据形式如下(只截取了三条): mysql> show processlist; +-----+-------------+--------------------+-------+---------+-------+----------------------------------+---------- | Id | User | Host | db | Command | Tim e| State | Info +-----+-------------+--------------------+-------+---------+-------+----------------------------------+---------- |207|root |192.168.0.20:51718 |m ytest | Sleep | 5 | | NULL |208|root |192.168.0.20:51719 |m ytest | Sleep | 5 | | NULL |220|root |192.168.0.20:51731 |m ytest |Query | 84 | Locked | select bookname,culture,value,type from book where id=001 先简单说一下各列的含义和用途,第一列,id,不用说了吧,一个标识,你要kill一个语句的时候很有用。user列,显示单前用户,如果不是root,这个命令就只显示你权限范围内的sql 语句。host列,显示这个语句是从哪个ip的哪个端口上发出的。呵呵,可以用来追踪出问题语句的用户。db列,显示这个进程目前连接的是哪个数据库。command列,显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。tim e列,此这个状态持续的时间,单位是秒。state列,显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个sql语句,已查询为例,可能需要经过copying to t m p table,Sorting result,Sending data等状态才可以完成,info列,显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。 这个命令中最关键的就是state列,m ysql列出的状态主要有以下几种: Checking table 正在检查数据表(这是自动的)。 Closing tables 正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。 Connect Out 复制从服务器正在连接主服务器。 Copying to tmp table on disk 由于临时结果集大于t m p_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。 Creating t m p table 正在创建临时表以存放部分查询结果。

MySQL数据库性能(SQL)优化方案

MySQL数据库性能(SQL)优化方案本文探讨了提高MySQL 数据库性能的思路,并从8个方面给出了具体的解决方法。 1、选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN 来定义整型字段。 另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。 对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。 2、使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,如下所示: DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )

【IT专家】Mysql避免全表扫描sql查询优化 .

本文由我司收集整编,推荐下载,如有疑问,请与我司联系 Mysql避免全表扫描sql查询优化. 2013/06/24 0 Explain的type显示的是访问类型,是较为重要的一个指标,结果从好到坏依次是:system const eq_ref ref fulltext ref_or_null index_merge unique_subquery index_subquery range index ALL一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。Explain的Extra信息也相当重要,如果此信息显示Using filesort或者Using temporary的话,噩梦即将开始,不过也不尽然,比如说在一个WHERE ... ORDER BY ... 类型的查询里,很多时候我们无法创建一个兼顾WHERE和ORDER BY的索引,此时如果按照WHERE 来确定索引,那么在ORDER BY时,就必然会引起Using filesort,文件排序是好是坏需要仔细判断,说白了就是看是先过滤再排序划算,还是先排序再过滤划算,正确答案取决与数据分布的情况,具体的情况可以参考Using index for ORDER BY vs restricting number of rows。 ? ?对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引: ?.尝试下面的技巧以避免优化器错选了表扫描: ?·使用ANALYZE TABLEtbl_name为扫描的表更新关键字分布。 ?·对扫描的表使用FORCEINDEX告知MySQL,相对于使用给定的索引表扫描将非常耗时。 ?SELECT * FROM t1, t2 FORCE INDEX (index_for_column) ?WHERE t1.col_name=t2.col_name; ?·用--max-seeks-for-key=1000选项启动mysqld或使用SET max_seeks_for_key=1000告知优化器假设关键字扫描不会超过1,000次关键字搜 索。 ? ?1. 应尽量避免在where 子句中对字段进行null 判断,否则将导致引擎放弃使用

30种mysql优化sql语句查询的方法

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 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.下面的查询也将导致全表扫描: select id from t where name like '%abc%' 若要提高效率,可以考虑全文检索。 6.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 7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:

MySQL数据库查询的三种优化方法

MySQL数据库查询的三种优化方法 任何一位数据库程序员都会有这样的体会:高通信量的数据库驱动程序中,一条糟糕的SQL查询语句可对整个应用程序的运行产生严重的影响,其不仅消耗掉更多的数据库时间,且它将对其他应用组件产生影响。 如同其它学科,优化查询性能很大程度上决定于开发者的直觉。幸运的是,像MySQL这样的数据库自带有一些协助工具。本文简要讨论诸多工具之三种:使用索引,使用EXPLAIN分析查询以及调整MySQL 的内部配置。 一、使用索引 MySQL允许对数据库表进行索引,以此能迅速查找记录,而无需一开始就扫描整个表,由此显著地加快查询速度。每个表最多可以做到16个索引,此外MySQL还支持多列索引及全文检索。 给表添加一个索引非常简单,只需调用一个CREATE INDEX命令并为索引指定它的域即可。列表A给出了一个例子: mysql> CREATE INDEX idx_username ON users(username); Query OK, 1 row affected (0.15 sec) Records: 1 Duplicates: 0 Warnings: 0 列表A 这里,对users表的username域做索引,以确保在WHERE或者HAVING子句中引用这一域的SELECT查询语句运行速度比没有添加索引时要快。通过SHOW INDEX命令可以查看索引已被创建(列表B)。 列表B 值得注意的是:索引就像一把双刃剑。对表的每一域做索引通常没有必要,且很可能导致运行速度减慢,因为向表中插入或修改数据时,MySQL不得不每次都为这些额外的工作重新建立索引。另一方面,避免对表的每一域做索引同样不是一个非常好的主意,因为在提高插入记录的速度时,导致查询操作的速度减慢。

数据库的查询优化方法分析

数据库的查询优化方法分析 发表时间:2010-04-01T21:52:03.827Z 来源:《中小企业管理与科技》2010年2月下旬刊供稿作者:赵云峰甘建 [导读] 索引作为数据库中的重要数据结构,它的根本目的就是为了提高查询的效率 赵云峰甘建(玉溪师范学院信息技术工程学院) 摘要:本文主要探讨了在数据库的应用中对数据库查询优化的一些策略,其中包括基于索引、SQL语句的优化的方法,并简要对其他一些常用方法做了介绍。 关键词:数据库查询优化查询优化 0 引言 随着计算机应用的深入,计算机技术的成熟,各种应用软件的普及,应用数据也随着日常工作而迅速增长,作为数据仓库的数据库的重要性也日益显著。 数据库系统作为管理信息系统的核心,各种基于数据库的联机事务处理以及联机分析处理正慢慢的转变成为计算机应用的最为重要的部分,根据以往大量的应用实例来看,在数据库的各种操作中,查询操作所占的比重最大,而在查询操作中基于SELECT语句在SQL语句中又是代价最大的语句。如果在使用中采用了优秀的查询策略,往往可以降低查询的时间,提高查询的效率,由此可见查询优化在数据库中的重要性。本文就数据库查询优化中的策略进行介绍及探索。 1 基于索引的优化 数据库的优化方法多种多样,不同的方法对提高数据库查询效率也不相同。 索引作为数据库中的重要数据结构,它的根本目的就是为了提高查询的效率。而优化查询的重要方法就是建立索引,建立适合关系数据库系统的索引,这样就可以避免表扫描,并减少了因为查询而造成的输入输出开销,有效提高数据库数据的查询速度,优化了数据库性能。然而在创建索引时也增加了系统时间和空间的开销。所以创建索引时应该与实际查询需求相结合,这样才能实现真正的优化查询。 1.1 判断并建立必要的索引对所要创建的索引进行正确的判断,使所创建的索引对数据库的工作效率提高有所帮助。为了实现这一点,我们应做到以下要求:在熟记数据库程序中的相关SQL语句的前提下,统计出常用且对性能有影响的语句;判断数据库系统中哪些表的哪些字段要建立索引。其次,对数据库中操作频繁的表,数据流量较大的表,经常需要与其他表进行连接的表等,要进行重点关注。这些表上的索引将对SQL语句的性能产生重要的影响。 1.2 对索引使用的一些规则索引的使用在一些大型数据库系统中会经常使用到,这样可以有效的提高数据库性能,使数据库的访问速度得到提高。但索引的使用要恰倒好处,所以我们在使用索引时应遵守使用原则:建立索引可以提高数据库的查询速度,但索引过多,不但不能实现优化查询,反而会影响到数据库的整体性能。索引作为数据库中实际存在的对象,每个索引都要占用一定的物理空间。所以对于索引的建立要考虑到物理空间容量,以及所建立索引的必要性和实用性。 1.3 合理的索引对SQL语句的意义索引建立之后,还要确保其得到了真正的使用,发挥了其应有的作用。首先,可以通过SQL语句查询来确定所建立的索引是否得到了使用,找出没有使用到的索引。分析索引建立但没有使用的原因,使其真正发挥作用。其次,索引得到使用以后,是否得到了预期的效果,对数据库的性能是否实现了真正意义上的提高,只有合理的索引才能真正提高数据库的性能。 2 优化SQL语句 在使用索引时可以有效的提高查询速度,但如果SQL语句使用不恰当的话,所建立的索引就不能发挥其作用。所以我们应该做到不但会写SQL,还要写出性能优良的SQL语句。下面,就如何优化引用例子进行说明。 首先,在进行查询时,返回的值应该是查询所需要的。在查询中应该尽量减少对数据库中的表的访问行数,使查询的结果范围最小,这就意味着在查询时,不能过多的使用通配符,如:select*from table1语句,而应该做到最小化查询范围,要查询几行几列就选择几行几列,如:select col1 from table1;多数情况下,用户并不需要查询到的所有数据,而只是部分或靠前的数据时,我们也可以通过SQL语句来进行限制查询的结果,如:select top 50 col1 from table1。 其次,对于一些特殊的SQL语句,在使用时应正确选择。我们用一组例子来说明,如:EXISTS,NOT EXISTS。 语句一:select sum(t1.c1) from t1 where((select count(*)from t2 where t2.c2=t1.c2)>0) 语句二:select sum(t1.c1) from t1 where exists(select*from t2 where t2.c2=t1.c1) 两个语句所得到的结果相同,但,语句二的效率要远高于语句一,因为语句一在查询中产生了大量的索引扫描。 在对数据库查询时,所使用的语句多种多样,但选择恰当的的字句能够有效的提高查询效率。 最后,WHERE子句在使用时应该注意的问题。 在WHERE子句中可以使用exist 和not exist代替in和not in。应该尽量避免使用in,not in,or 或者having。可以使用表链接代替exist。Having可以用where代替,如果无法代替可以分两步处理。 3 其他优化方法 数据库的查询优化方法不仅仅是索引和SQL语句的优化,其他方法的合理使用同样也能很好的对数据库查询功能起到优化作用。我们就来列举几种简单实用的方法。 3.1 避免或简化排序应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。 3.2 避免相关子查询如果在主查询和WHERE子句中的查询中同时出现了一个列的标签,这样就会使主查询的列值改变后,子查询也必须重新进行一次查询。因为查询的嵌套层次越多,查询的效率就会降低,所以我们应当避免子查询。如果无法避免,就要在查询的过程中过滤掉尽可能多的。 3.3 创建使用临时表在表的一个子集进行排序并创建临时表,也能实现加速查询。在一些情况下这样可以避免多重排序操作。但所创建的临时表的行要比主表的行少,其物理顺序就是所要求的顺序,这样就减少了输入和输出,降低了查询的工作量,提高了效率,而且临时表的创建并不会反映主表的修改。 3.4 用排序来取代非顺序存取磁盘存取臂的来回移动使得非顺序磁盘存取变成了最慢的操作。但是在SQL语句中这个现象被隐藏了,

优化MySQL数据库性能的八大妙招

优化MySQL 数据库性能的八大妙招(1)本文探讨了提高MySQL数据库性能的思路,并从8个方面给出了具体的解决方法。这八个方面是:1、选取最适用的字段属性;2、使用连接(JOIN来代替子查询(Sub-Queries) 3、使用联合(UNION)来代替手动创建的临时表;4、事务;5、锁定表;6、使用外键;7、使用索引;8、优化的查询语句。 AD: 本文探讨了提高MySQL 数据库性能的思路,并从8 个方面给出了具体的解决方法。 1、选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小, 在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255)显然给数据库增加了不必要的空间,甚至使用VARCHAF这种类型也是多余的,因为CHAR(6就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。 另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。 对于某些文本字段,例如省份”或者性别”我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。 2、使用连接(JOIN来代替子查询(Sub-Queries) MySQL从开始支持SQL的子查询。这个技术可以使用SELECT S句来创建一个单列

数据库查询优化方法研究

数据库查询优化方法研究 摘要:随着数据库技术的高速发展,数据库系统已成为现代计算机信息系统和计算机应用系统的基础和核心,信息社会的发展已越来越离不开数据库。该文针对当前使用数据库查询在效率方面遇到的一些问题,主要从SQL语句的优化方面提出一些策略和方法,并提出使用SQL语句时需要注意的事项。 关键词:数据库查询;SQL;索引;优化 中图分类号:TP311文献标识码:A文章编号: 1009-3044(2011)17-4011-02 Studies on the Optimiztion of Database Retrieval YANG Chang-yao (Zhanjiang Institute of Education, Zhanjiang 524037, China) Abstract: With the rapid development of Database Technology, Database System has become the foundation and core of modern computer information system and computer application system, as Database is a must in the development of an information society. The current paper targets on some efficiency problems in Database retrieval, offers some strategies and solutions from the perspective of optimizing SQL statement,

MySQL查询优化的研究和改进

华中科技大学 硕士学位论文MySQL查询优化的研究和改进 姓名:孙辉 申请学位级别:硕士 专业:计算机软件与理论指导教师:吴恒山 20070606

摘要 查询是数据库系统中最基本也是最常用的一种操作,因此查询是否具有较快的执行速度,已成为数据库用户和设计者极其关心的问题。在研究开源数据库管理系统MySQL查询优化技术的基础上,主要从MySQL配置参数调优,MySQL查询重用功能,MySQL查询重写的相关规则,MySQL计划优化四个方面展开工作。 针对配置参数调优问题,主要从数据缓冲区和日志缓冲区两方面详细介绍了MySQL相关的调优参数。然后研究了MySQL调优的两种方法:人工调优和基于案例的调优,并在此基础上提出了一种动态的自调优算法-爬山法,该方法有效解决了MySQL自身两种调优方法存在的不足。 对于查询重用问题,主要针对MySQL重用实现存在的两个问题:重用性不高和不能合理处理大数据集,做出了改进。对于前者,通过增加规范SQL语句关键字和消除多余无效字符的模块来解决。对于后者,通过增加缓存查询执行计划模块来解决,使用缓存查询计划模块来代替MySQL原本的缓存查询结果模块。 对于查询重写问题,在研究MySQL现有查询重写技术的基础上,以带IN谓词的子查询为例归纳了其子查询合并的算法,然后提出了两个查询重写规则,NOT操作符重写和外连接转换为一般连接。通过重写,确实提高了MySQL查询的速度。 针对计划优化问题,主要研究了MySQL基于规则的优化和基于代价的优化这两种方法。对于前者,详细的介绍了MySQL预定义的一些连接类型及其优先级,对于后者,研究了MySQL在决定表连接顺序时所采用的贪婪算法的具体实现。 所有的实验都是采用TPCH标准测试,数据量为10M,实验对改进工作进行了验证,实验结果表明我们的改进工作确实提高了MySQL的查询速度。 关键词:查询优化,查询重用,查询重写,计划优化

相关主题