在优化查询中,数据库应用(如MySQL)即意味着对工具的操作与使用。使用索引、使用EXPLAIN分析查询以及调整MySQL的内部配置可达到优化查询的目的。

任何一位数据库程序员都会有这样的体会:高通信量的数据库驱动程序中,一条糟糕的SQL查询语句可对整个应用程序的运行产生严重的影响,其不仅消耗掉更多的数据库时间,且它将对其他应用组件产生影响。

如同其它学科,优化查询性能很大程度上决定于开发者的直觉。幸运的是,像MySQL这样的数据库自带有一些协助工具。本文简要讨论诸多工具之三种:使用索引,使用EXPLAIN分析查询以及调整MySQL的内部配置。

#1:使用索引

MySQL允许对数据库表进行索引,以此能迅速查找记录,而无需一开始就扫描整个表,由此显著地加快查询速度。每个表最多可以做到16个索引,此外MySQL还支持多列索引及全文检索。

给表添加一个索引非常简单,只需调用一个CREATE INDEX命令并为索引指定它的域即可。列表A给出了一个例子:

列表A

mysql> CREATE INDEX idx_username ON users(username);

Query OK, 1 row affected (0.15 sec)

Records: 1 Duplicates: 0 Warnings: 0

这里,对users表的username域做索引,以确保在WHERE或者HAVING子句中引用这一域的SELECT查询语句运行速度比没有添加索引时要快。通过SHOW INDEX命令可以查看索引已被创建(列表B)。

列表B

mysql> SHOW INDEX FROM users;

--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

| Table | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |

--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

| users |          1 | idx_username |            1 | username    | A         |      NULL |     NULL | NULL   | YES | BTREE      |         |

--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

1 row in set (0.00 sec)

值得注意的是:索引就像一把双刃剑。对表的每一域做索引通常没有必要,且很可能导致运行速度减慢,因为向表中插入或修改 数据时,MySQL不得不每次都为这些额外的工作重新建立索引。另一方面,避免对表的每一域做索引同样不是一个非常好的主意,因为在提高插入记录的速度 时,导致查询操作的速度减慢。这就需要找到一个平衡点,比如在设计索引系统时,考虑表的主要功能(数据修复及编辑)不失为一种明智的选择。

#2:优化查询性能

在分析查询性能时,考虑EXPLAIN关键字同样很管用。EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。下面的一个简单例子可以说明(列表C)这一过程:

列表C

mysql> EXPLAIN SELECT city.name, city.district FROM city, country WHERE city.countrycode = country.code AND country.code = 'IND';

+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+

| id | select_type | table   | type | possible_keys | key     | key_len | ref | rows | Extra       |

+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+

| 1 | SIMPLE      | country | const | PRIMARY       | PRIMARY | 3       | const |    1 | Using index |

| 1 | SIMPLE      | city    | ALL   | NULL          | NULL    | NULL    | NULL | 4079 | Using where |

+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+

2 rows in set (0.00 sec)这里查询是基于两个表连接。EXPLAIN关键字描述了MySQL是如何处理连接这两个表。必须清楚的是,当前设计要求MySQL处理的是country表中的一条记录以及city表中的整个4019条记录。这就意味着,还可使用其他的优化技巧改进其查询方法。例如,给city表添加如下索引(列表D):

列表D

mysql> CREATE INDEX idx_ccode ON city(countrycode);Query OK, 4079 rows affected (0.15 sec)

Records: 4079 Duplicates: 0 Warnings: 0

现在,当我们重新使用EXPLAIN关键字进行查询时,我们可以看到一个显著的改进(列表E):

列表E

mysql> EXPLAIN SELECT city.name, city.district FROM city, country WHERE city.countrycode = country.code AND country.code = 'IND';

+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+

| id | select_type | table   | type | possible_keys | key       | key_len | ref   | rows | Extra       |

+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+

| 1 | SIMPLE      | country | const | PRIMARY       | PRIMARY   | 3       | const |    1 | Using index |

| 1 | SIMPLE      | city    | ref   | idx_ccode     | idx_ccode | 3       | const | 333 | Using where |

+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+

2 rows in set (0.01 sec)

在这个例子中,MySQL现在只需要扫描city表中的333条记录就可产生一个结果集,其扫描记录数几乎减少了90%!自然,数据库资源的查询速度更快,效率更高。

#3:调整内部变量

MySQL是如此的开放,所以可轻松地进一步调整其缺省设置以获得更优的性能及稳定性。需要优化的一些关键变量如下:

改变索引缓冲区长度(key_buffer)

一般,该变量控制缓冲区的长度在处理索引表(读/写操作)时使用。MySQL使用手册指出该变量可以不断增加以确保索引表的最佳性能,并推荐使用与系统内存25%的大小作为该变量的值。这是MySQL十分重要的配置变量之一,如果你对优化和提高系统性能有兴趣,可以从改变key_buffer_size变量的值开始。

改变表长(read_buffer_size)

当一个查询不断地扫描某一个表,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果你认为连续扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。

设定打开表的数目的最大值(table_cache)

该变量控制MySQL在任何时候打开表的最大数目,由此能控制服务器响应输入请求的能力。它跟max_connections变量密切相关,增加table_cache值可使MySQL打开更多的表,就如增加max_connections值可增加连接数一样。当收到大量不同数据库及表的请求时,可以考虑改变这一值的大小。

对缓长查询设定一个时间限制(long_query_time)

MySQL带有“慢查询日志”,它会自动地记录所有的在一个特定的时间范围内尚未结束的查询。这个日志对于跟踪那些低效率或者行为不端的查询以及寻找优化对象都非常有用。long_query_time变量控制这一最大时间限定,以秒为单位。

以上讨论并给出用于分析和优化SQL查询的三种工具的使用方法,以此提高你的应用程序性能。使用它们快乐地优化吧!

mysql怎么加快搜索_优化mysql数据库 提高检索速度相关推荐

  1. mysql消除冗余关键字_优化mysql语句 - 可爱的wzz的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.查询SQL尽量不要使用select *,而是select具体字段. 反例子: select * from employee; 正例子: select id,name from employee; ...

  2. oa服务器优化,如何优化OA以提高访问速度

    如何优化OA以提高访问速度 注意以下1-3步要斟酌执行,被删除的文件和附件不能再恢复,执行前请做好数据库和附件的备份 1在系统管理-系统日志管理-日志管理中点击"系统日志存档" . ...

  3. 探索神经网络的奥秘:如何优化模型和提高训练速度

    探索神经网络的奥秘:如何优化模型和提高训练速度 本文将阐述如何优化神经网络模型以提高训练速度,内容分为以下七个章节: 章节 1: 神经网络优化方法概述 章节 2: 调整学习率 章节 3: 网络架构改进 ...

  4. mysql 数据查询优化_优化MySQL数据库查询的三种方法

    任何一位数据库程序员都会有这样的体会:高通信量的数据库驱动程序中,一条糟糕的SQL查询语句可对整个应用程序的运行产生严重的影响,其不仅消耗掉更多的数据库时间,且它将对其他应用组件产生影响. 如同其它学 ...

  5. 深入浅出mysql唐汉名_深入浅出MySQL++数据库开发、优化与管理维护+第2版+唐汉明 -- 存储引擎 - 数据类型 - 字符集和校验规则 -...

    create schema deepInMySql; use deepInMySql; -- 查看当前默认存储引擎 show variables like '%table_type%'; -- 查看当 ...

  6. mysql 中文分词搜索_利用中文分词打造数据库全文检索

    传统的 LIKE 模糊查询(前置百分号)无法利用索引,特别是多个关键词 OR,或在多个字段中 LIKE,更是效率低下.本文研究对文章进行分词以提高检索的准确度和查询效率. 根据自己的编程语言选择一款合 ...

  7. mysql读缓存_优化MySQL,还是使用缓存?读一篇文章有感

    今天我想对一个Greenfield项目上可以采用的各种性能优化策略作个对比.换言之,该项目没有之前决策强加给它的各种约束限制,也还没有被优化过. 具体来说,我想比较的两种优化策略是优化MySQL和缓存 ...

  8. 简易mysql优化_优化 MySQL:简单三个技巧

    原标题:优化 MySQL:简单三个技巧 技巧#1:为临时表分配足够的内存 在某些情况下,服务器在处理语句时会创建内部临时表.临时表用于内部操作如GROUP BY和distinct,还有一些ORDER ...

  9. mysql 自增长改动_优化了MYSQL大量写入问题,老板奖励了1000块给我

    摘要:大家提到Mysql的性能优化都是注重于优化sql以及索引来提升查询性能,大多数产品或者网站面临的更多的高并发数据读取问题.然而在大量写入数据场景该如何优化呢? 今天这里主要给大家介绍,在有大量写 ...

最新文章

  1. await使用中的阻塞和并发(一)
  2. Android客户端实现七牛云存储文件上传
  3. 科大星云诗社动态20210902
  4. 数据可视化组队学习:《Task02 - 艺术画笔见乾坤》笔记
  5. 机器人统治人类?别逗!现实中的机器人是这样的
  6. 使用linux_使用 AppImage 进行 Linux 软件包管理 | Linux 中国
  7. (转)ATOM介绍和使用
  8. 微信支付,判断是否安装了微信
  9. 斯坦福大学机器学习相关网站——Andrew Ng
  10. easyUI替换非16x16的图标
  11. Linux中mount挂载命令及其概念
  12. 异步IO框架实现之完成端口(Completion Port)
  13. 简单文本分割器V1.0发布(包括源码)
  14. 21 皮克定理 姿势不对一直wa到死亡
  15. 拓嘉启远:拼多多前期没有流量如何补充
  16. javascript 知识
  17. Android辅助权限实战之微信自动评论与点赞
  18. Java实现word文档转pdf(无需插件,仅需一个jar包)
  19. 加密解密及其javascript实现
  20. 一个SAPer的网络日志-连载四-三不主义下的项目经理

热门文章

  1. 如何用matlab求线性方程的通解,用matlab求线性方程的解
  2. 币圈拉盘是什么意思?
  3. c语言倍增算法,用倍增公式选股
  4. idea自定义过滤器
  5. MATLAB如何求传函,FeedBack system matlab整理
  6. Java实现 LeetCode 278 第一个错误的版本
  7. zuk如将手机更新到Android10,ZUI新升级:ZUK宣布支持全机型升级Android N系统
  8. 敏捷个人2012.5月份户外活动报道:0费用京郊经典户外路线【京西古道】
  9. CloseableHttpClient方式配置代理服务器访问外网
  10. 预告 | 从单点工具到平台,默安科技研发安全一体化管理平台即将发布