仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 599|回复: 7
打印 上一主题 下一主题

[学习教程] 公布优化MySQL数据库查询的三个办法

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-16 20:12:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
也许最好的策略是以不变应万变:给客户他们所需要的,不多也不少。如果MySQL学习教程适合他们,他们就不应该买别的工具。事实上,云计算产业一直推崇自助服务,但提供这些服务的公司已经开始认识到解决方案提供商推销他们商品的价值。在优化查询中,数据库使用(如MySQL)即意味着对工具的操纵与利用。利用索引、利用EXPLAIN剖析查询和调剂MySQL的外部设置可到达优化查询的目标。 任何一名数据库程序员城市有如许的体味:高通讯量的数据库驱动程序中,一条糟的SQL查询语句可对全部使用程序的运转发生严峻的影响,其不但损耗失落更多的数据库工夫,且它将对其他使用组件发生影响。 好像别的学科,优化查询功能很年夜水平上决意于开辟者的直觉。侥幸的是,像MySQL如许的数据库自带有一些帮忙工具。本文扼要会商诸多工具之三种:利用索引,利用EXPLAIN剖析查询和调剂MySQL的外部设置。#1:利用索引 MySQL同意对数据库表举行索引,以此能敏捷查找纪录,而无需一入手下手就扫描全部表,由此明显地加速查询速率。每一个表最多能够做到16个索引,别的MySQL还撑持多列索引及全文检索。 给表增加一个索引十分复杂,只需挪用一个CREATEINDEX命令并为索引指定它的域便可。列表A给出了一个例子:列表Amysql>CREATEINDEXidx_usernameONusers(username);
QueryOK,1rowaffected(0.15sec)
Records:1Duplicates:0Warnings:0 这里,对users表的username域做索引,以确保在WHERE大概HAVING子句中援用这一域的SELECT查询语句运转速率比没有增加索引时要快。经由过程SHOWINDEX命令能够检察索引已被创立(列表B)。列表Bmysql>SHOWINDEXFROMusers;
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
|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||65g站长资讯
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
1rowinset(0.00sec) 值得注重的是:索引就像一把双刃剑。对表的每域做索引一般没有需要,且极可能招致运转速率减慢,由于向表中拔出或修正数据时,MySQL不能不每次都为这些分外的事情从头创建索引。另外一方面,制止对表的每域做索引一样不是一个十分好的主张,由于在进步拔出纪录的速率时,招致查询操纵的速率减慢。这就必要找到一个均衡点,好比在计划索引体系时,思索表的次要功效(数据修复及编纂)不掉为一种明智的选择。#2:优化查询功能 在剖析查询功能时,思索EXPLAIN关头字一样很管用。EXPLAIN关头字一样平常放在SELECT查询语句的后面,用于形貌MySQL怎样实行查询操纵、和MySQL乐成前往了局集必要实行的行数。上面的一个复杂例子能够申明(列表C)这一历程:列表Cmysql>EXPLAINSELECTcity.name,city.districtFROMcity,countryWHEREcity.countrycode=country.codeANDcountry.code=IND;
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
|id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
|1|SIMPLE|country|const|PRIMARY|PRIMARY|3|const|1|Usingindex|
|1|SIMPLE|city|ALL|NULL|NULL|NULL|NULL|4079|Usingwhere|
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
2rowsinset(0.00sec)这里查询是基于两个表毗连。EXPLAIN关头字形貌了MySQL是怎样处置毗连这两个表。必需分明的是,以后计划请求MySQL处置的是country表中的一笔记录和city表中的全部4019笔记录。这就意味着,还可以使用其他的优化技能改善其查询办法。比方,给city表增加以下索引(列表D):列表Dmysql>CREATEINDEXidx_ccodeONcity(countrycode);
QueryOK,4079rowsaffected(0.15sec)
Records:4079Duplicates:0Warnings:0如今,当我们从头利用EXPLAIN关头字举行查询时,我们能够看到一个明显的改善(列表E):列表Emysql>EXPLAINSELECTcity.name,city.districtFROMcity,countryWHEREcity.countrycode=country.codeANDcountry.code=IND;
+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+
|id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+
|1|SIMPLE|country|const|PRIMARY|PRIMARY|3|const|1|Usingindex|
|1|SIMPLE|city|ref|idx_ccode|idx_ccode|3|const|333|Usingwhere|
+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+
2rowsinset(0.01sec) 在这个例子中,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查询的三种工具的利用办法,以此进步你的使用程序功能。利用它们康乐地优化吧!
一个相关的问题是第三方支持的资格问题,尽管直接来自厂商的支持和服务可以一定程度上减缓这个问题,但是,对于有的企业来说,通过强有力的本地化支持显然更有吸引力。
若相依 该用户已被删除
沙发
发表于 2015-1-18 18:49:06 来自手机 | 只看该作者
大侠们有推荐的书籍和学习方法写下吧。
飘灵儿 该用户已被删除
板凳
发表于 2015-2-4 21:51:06 | 只看该作者
作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!
小魔女 该用户已被删除
地板
发表于 2015-2-10 20:54:59 | 只看该作者
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
5#
 楼主| 发表于 2015-3-1 15:22:18 | 只看该作者
所以你总能得到相应的升级版本,来满足你的需求。
爱飞 该用户已被删除
6#
发表于 2015-3-10 19:57:03 | 只看该作者
XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)
不帅 该用户已被删除
7#
发表于 2015-3-17 10:10:26 | 只看该作者
分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。
因胸联盟 该用户已被删除
8#
发表于 2015-3-24 07:03:41 | 只看该作者
sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 10:53

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表