mysql性能的检查和调优方法(3)

来源:asp之家 时间:2009-05-17 09:21:00 

加到1000的时候结果集变成了312条,排序效率应该是可以接受。

不过,采用换索引这种优化方式需要取一个采样点,比如这个例子中的1000这个数字,这样,对userid的每个数值,都要去找一个采样点,这样对程序来说是很难办的。如果按1000取样的话,那么userid='7mini'这个例子中,取到的结果将不会是8条,而是2条,给用户造成了困惑。

当然还有另一种办法,加入双索引:

create index userid_clicks on imgs (userid, clicks)

mysql> desc select * from imgs where userid="admin" order by clicks desc limit 10;

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

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

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

| 1 | SIMPLE | imgs | ref | userid,userid_clicks | userid_clicks | 51 | const | 2944 | Using where |

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

1 row in set (0.00 sec)

这时可以看到,结果集还是2944条,但是Extra中的filesort不见了。这时mysql使用userid_clicks这个索引去查询,这不但能快速查询到userid="admin"的所有记录,并且结果是根据clicks排好序的!所以不用再把这个结果集读入内存一条一条排序了,效率上会高很多。

但是用多字段索引这种方式有个问题,如果查询的sql种类很多的话,就得好好规划一下了,否则索引会建得非常多,不但会影响到数据insert和update的效率,而且数据表也容易损坏。

以上是对索引优化的办法,因为原因可能会比较复杂,所以写得比较的长,一般好好优化了索引之后,mysql的效率会提升n个档次,从而也不需要考虑增加机器来解决问题了。

但是,mysql甚至所有数据库,可能都不好解决limit的问题。在mysql中,limit 0,10只要索引合适,是没有问题的,但是limit 100000,10就会很慢了,因为mysql会扫描排好序的结果,然后找到100000这个点,取出10条返回。要找到100000这个点,就要扫描100000条记录,这个循环是比较耗时的。不知道会不会有什么好的算法可以优化这个扫描引擎,我冥思苦想也想不出有什么好办法。对于limit,目前直至比较久远的将来,我想只能通过业务、程序和数据表的规划来优化,我想到的这些优化办法也都还没有一个是万全之策,往后再讨论。

2、sql写法过于复杂

sql写法假如用到一些特殊的功能,比如groupby、或者多表联合查询的话,mysql用到什么方式来查询也可以用desc来分析,我这边用复杂sql的情况还不算多,所以不常分析,暂时就没有好的建议。

3、配置错误

配置里主要参数是key_buffer、sort_buffer_size/myisam_sort_buffer_size,这两个参数意思是:

key_buffer=128M:全部表的索引都会尽可能放在这块内存区域内,索引比较大的话就开稍大点都可以,我一般设为128M,有个好的建议是把很少用到并且比较大的表想办法移到别的地方去,这样可以显著减少mysql的内存占用。

sort_buffer_size=1M:单个线程使用的用于排序的内存,查询结果集都会放进这内存里,如果比较小,mysql会多放几次,所以稍微开大一点就可以了,重要是优化好索引和查询语句,让他们不要生成太大的结果集。

另外一些配置:

thread_concurrency=8:这个配置标配=cpu数量x2

interactive_timeout=30

wait_timeout=30:这两个配置使用10-30秒就可以了,这样会尽快地释放内存资源,注意:一直在使用的连接是不会断掉的,这个配置只是断掉了长时间不动的连接。

query_cache:这个功能不要使用,现在很多人看到cache这几个字母就像看到了宝贝,这是不唯物主义的。mysql的query_cache在每次表数据有变化的时候都会重新清理连至该表的所有缓存,如果更新比较频繁,query_cache不但帮不上忙,而且还会对效率影响很大。这个参数只适合只读型的数据库,如果非要用,也只能用query_cache_type=2自行用SQL_CACHE指定一些sql进行缓存。

max_connections:默认为100,一般情况下是足够用的,但是一般要开大一点,开到400-600就可以了,能超过600的话一般就有效率问题,得另找对策,光靠增加这个数字不是办法。

其它配置可以按默认就可以了,个人觉得问题还不是那么的大,提醒一下:1、配置虽然很重要,但是在绝大部分情况下都不是效率问题的罪魁祸首。2、mysql是一个数据库,对于数据库最重要考究的不应是效率,而是稳定性和数据准确性。

标签:mysql,性能,检查,调优
0
投稿

猜你喜欢

  • 基于python traceback实现异常的获取与处理

    2022-04-05 09:59:32
  • 简要介绍SQL Server 2008新的事件处理系统

    2009-12-22 08:15:00
  • IE7 与 IE6 的模式窗口尺寸差异

    2008-03-06 13:49:00
  • Python使用BeautifulSoup4修改网页内容的实战记录

    2023-04-10 15:59:56
  • Python类的定义、继承及类对象使用方法简明教程

    2021-09-01 21:43:10
  • Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计

    2023-09-25 13:01:40
  • python读取并绘制nc数据的保姆级教程

    2023-11-23 02:19:24
  • 利用Python将时间或时间间隔转为ISO 8601格式方法示例

    2022-12-06 22:18:25
  • 观点 2009 年,IE6 走好

    2009-01-04 16:46:00
  • pytorch如何利用ResNet18进行手写数字识别

    2022-02-07 04:07:26
  • python numpy数组复制使用实例解析

    2023-06-22 07:27:06
  • Python 获得13位unix时间戳的方法

    2022-12-08 18:26:25
  • Python编程调用百度API实现地理位置经纬度坐标转换示例

    2023-12-30 11:44:38
  • 关于python并发编程中的协程

    2023-10-18 04:37:44
  • python3通过udp实现组播数据的发送和接收操作

    2023-01-14 02:27:42
  • 基于pandas向csv添加新的行和列

    2021-11-29 02:28:56
  • SQL Server数据库连接中常见的错误分析

    2009-01-15 12:51:00
  • python实现图片压缩代码实例

    2023-07-11 06:35:22
  • Springboot项目对数据库用户名密码实现加密过程解析

    2024-01-19 23:02:04
  • Django模型中字段属性choice使用说明

    2022-06-23 16:28:20
  • asp之家 网络编程 m.aspxhome.com