表示 进入内容 127112801423
« 先前的 10 新的记录 | 下一步 10 较早的记录 »
Displaying posts with tag: database (reset)
[MySQL SQL优化系列]之连接查询

MySQL的连接查询包括内连接(inner join)、外连接(left/right join,下文一律以left join代替)、交叉连接(在MySQL中等价于内连接,但是在标准SQL中是不等价的)、全连接(MySQL不支持full join,但是可以通过union构造),本文主要讲解一般我们在写SQL中最常用的:内连接以及外连接两种连接查询,通过一些案例来说明我们在使用关联查询中需要注意什么问题,要怎么做才能做到最优查询。

重点说在前面

  1. MySQL对表连接至今只支持nested loop join,而不支持hash join,这个是MySQL不建议执行复杂关联查询的根源(MariaDB已经实现hash join)

    通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。

[获取更多]
[MySQL案例]之Discuz大表拆分

背景

相信很多用discuz搭建论坛服务的同学都有这个体验,整个数据库表都是MyISAM引擎,一旦帖子数量到一定量级的时候神马操作都是巨慢无比(MyISAM的各种缺点这里暂且不提)。以此为背景,我们打算对discuz论坛进行改版,简单说来就是彻底抛弃原有的归档功能直接分100张表,按照帖子ID取模分发数据,然后把新表都改成InnoDB引擎。

以这件事为背景,对这次升级过程中数据库的操作做一个记录以及简单分析。抛开前期准备,后期处理等等步骤,这里我们就说下中间的重要环节。

1.在帖子表里面新增一个字段,且加一条索引
2.更新新增字段的值为:mod(tid,100)+1
3.创建一个tempfs分区(需要比帖子表.MYD文件大)
4.使用select into oufile并发导出数据

[获取更多]
[MySQL案例]之Discuz大表拆分

背景

相信很多用discuz搭建论坛服务的同学都有这个体验,整个数据库表都是MyISAM引擎,一旦帖子数量到一定量级的时候神马操作都是巨慢无比(MyISAM的各种缺点这里暂且不提)。以此为背景,我们打算对discuz论坛进行改版,简单说来就是彻底抛弃原有的归档功能直接分100张表,按照帖子ID取模分发数据,然后把新表都改成InnoDB引擎。

以这件事为背景,对这次升级过程中数据库的操作做一个记录以及简单分析。抛开前期准备,后期处理等等步骤,这里我们就说下中间的重要环节。

1.在帖子表里面新增一个字段,且加一条索引
2.更新新增字段的值为:mod(tid,100)+1
3.创建一个tempfs分区(需要比帖子表.MYD文件大)
4.使用select into oufile并发导出数据

[获取更多]
[MySQL SQL优化系列]之in与range查询

首先我们来说下in()这种方式的查询。在《高性能MySQL》里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的。使用in这种方式其实MySQL优化器是转化成了n*m种组合方式来进行查询,最终将返回值合并,有点类似union但是更高效。同时它存在这一些问题:

老版本的MySQL在IN()组合条件过多的时候会发生很多问题。查询优化可能需要花很多时间,并消耗大量内存。新版本MySQL在组合数超过一定的数量就不进行计划评估了,这可能导致MySQL不能很好的利用索引。

这里的“一定数量”在MySQL5.6.5以及以后的版本中是由eq_range_index_dive_limit这个参数控制(感谢 …

[获取更多]
[MySQL SQL优化系列]之in与range查询

首先我们来说下in()这种方式的查询。在《高性能MySQL》里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的。使用in这种方式其实MySQL优化器是转化成了n*m种组合方式来进行查询,最终将返回值合并,有点类似union但是更高效。同时它存在这一些问题:

老版本的MySQL在IN()组合条件过多的时候会发生很多问题。查询优化可能需要花很多时间,并消耗大量内存。新版本MySQL在组合数超过一定的数量就不进行计划评估了,这可能导致MySQL不能很好的利用索引。

这里的“一定数量”在MySQL5.6.5以及以后的版本中是由eq_range_index_dive_limit这个参数控制(感谢 …

[获取更多]
[MySQL案例]之恢复进程莫名被杀

今天上班就发现一起数据库例行恢复作业失败,失败提示为:“数据库恢复失败”,也就是说是在执行mysql < dumpfile的时候失败了。

12
      [ root@localhost ]#/usr/local/mysql56/bin/mysql -S ./mysql.sock bi_monitor < /home/mysql/backup/2014-09-21_bi_monitor_3346.sql ERROR 2006 (HY000) at line 294: MySQL server has gone away

MySQL server has gone away是指客户端与MySQL服务端之间的连接段开,一般来说原因有这么几个:

  1. MySQL crash:MySQL Server宕机
  2. connection timeout:客户端连接超时
  3. kill connection:连接进程被杀,与connection timeout差不多,区别在于一个是MySQL Server主动,一个是被动
  4. max_allowed_packet too small:返回结果集大于max_allowed_packet限制
[获取更多]
[MySQL案例]之恢复进程莫名被杀

今天上班就发现一起数据库例行恢复作业失败,失败提示为:“数据库恢复失败”,也就是说是在执行mysql < dumpfile的时候失败了。

12
      [ root@localhost ]#/usr/local/mysql56/bin/mysql -S ./mysql.sock bi_monitor < /home/mysql/backup/2014-09-21_bi_monitor_3346.sql ERROR 2006 (HY000) at line 294: MySQL server has gone away

MySQL server has gone away是指客户端与MySQL服务端之间的连接段开,一般来说原因有这么几个:

  1. MySQL crash:MySQL Server宕机
  2. connection timeout:客户端连接超时
  3. kill connection:连接进程被杀,与connection timeout差不多,区别在于一个是MySQL Server主动,一个是被动
  4. max_allowed_packet too small:返回结果集大于max_allowed_packet限制
[获取更多]
[MySQL案例]之一把看不见的锁

昨晚半夜处理了一个故障,只是简单SQL执行缺少索引导致CPU飙高,加一条索引就搞定。原来以为事情到此为止,让另外一个同事收尾准备睡觉了,这个时候高潮出现了。刚才处理的是一台slave server,为了保证实例数据对象一致性,让同事先删掉,然后在master server再加这条索引,最后发现add index的操作在slave server一直在等metadata lock释放了,并且在processlist里面居然找不到任何引起表锁的请求。就这样折腾了到凌晨,后面索性就丢在自己等锁释放,差不多过了6分钟创建成功,load再次下降。

分析

事后在5.5的手册中找到了解释:

To ensure transaction serializability, the server must not permit one session to perform a data definition language (DDL) statement on a table that is used in an uncompleted transaction in another session. The server achieves this by acquiring …

[获取更多]
[MySQL案例]之一把看不见的锁

昨晚半夜处理了一个故障,只是简单SQL执行缺少索引导致CPU飙高,加一条索引就搞定。原来以为事情到此为止,让另外一个同事收尾准备睡觉了,这个时候高潮出现了。刚才处理的是一台slave server,为了保证实例数据对象一致性,让同事先删掉,然后在master server再加这条索引,最后发现add index的操作在slave server一直在等metadata lock释放了,并且在processlist里面居然找不到任何引起表锁的请求。就这样折腾了到凌晨,后面索性就丢在自己等锁释放,差不多过了6分钟创建成功,load再次下降。

分析

事后在5.5的手册中找到了解释:

To ensure transaction serializability, the server must not permit one session to perform a data definition language (DDL) statement on a table that is used in an uncompleted transaction in another session. The server achieves this by acquiring …

[获取更多]
如何获取mysql帮助信息

    在开发或测试环境在碰到mysql相关故障时,大多数朋友可能会通过论坛发帖,QQ群讨论方式来获取帮助。该方式是获取帮助的有效途径之一。然而如果在生产环境,在没有网络的环境下,这些方式就无助于问题的解决。

【mysql】  【SQL】  【Server】  【字符集】  【database】   点击查看原文>

表示 进入内容 127112801423
« 先前的 10 新的记录 | 下一步 10 较早的记录 »