专访阿里RDS首席产品架构师何云飞:阿里云数据库的架构演进之路
原文作者:pipihappy8888 http://www.itpub.net/thread-1887486-1-1.html
如果说淘宝革了零售的命,那么DT革了企业IT消费的命。
【大数据】 【架构】 【NOSQL】 【mysql】 【RDS】 【SQL】 【高可用】 …
本次,我们来看看索引、提交频率对InnoDB表写入速度的影响,了解有哪些需要注意的。
先直接说几个结论吧:
1、关于索引对写入速度的影响: a、如果有自增列做主键,相对完全没索引的情况,写入速度约提升 3.11%; b、如果有自增列做主键,并且二级索引,相对完全没索引的情况,写入速度约降低 27.37%;
因此,InnoDB表最好总是有一个自增列做主键。
2、关于提交频率对写入速度的影响(以表中只有自增列做主键的场景,一次写入数据30万行数据为例):
a、等待全部数据写入完成后,最后再执行commit提交的效率最高; b、每10万行提交一次,相对一次性提交,约慢了1.17%; c、每1万行提交一次,相对一次性提交,约慢了3.01%; d、每1千行提交一次,相对一次性提交,约慢了23.38%; …[获取更多]
首先我们来说下in()这种方式的查询。在《高性能MySQL》里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的。使用in这种方式其实MySQL优化器是转化成了n*m种组合方式来进行查询,最终将返回值合并,有点类似union但是更高效。同时它存在这一些问题:
老版本的MySQL在IN()组合条件过多的时候会发生很多问题。查询优化可能需要花很多时间,并消耗大量内存。新版本MySQL在组合数超过一定的数量就不进行计划评估了,这可能导致MySQL不能很好的利用索引。
这里的“一定数量”在MySQL5.6.5以及以后的版本中是由eq_range_index_dive_limit这个参数控制(感谢 …
[获取更多]首先我们来说下in()这种方式的查询。在《高性能MySQL》里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的。使用in这种方式其实MySQL优化器是转化成了n*m种组合方式来进行查询,最终将返回值合并,有点类似union但是更高效。同时它存在这一些问题:
老版本的MySQL在IN()组合条件过多的时候会发生很多问题。查询优化可能需要花很多时间,并消耗大量内存。新版本MySQL在组合数超过一定的数量就不进行计划评估了,这可能导致MySQL不能很好的利用索引。
这里的“一定数量”在MySQL5.6.5以及以后的版本中是由eq_range_index_dive_limit这个参数控制(感谢 …
[获取更多]
数据库都是日志先行的啊,不写日志,数据库崩溃了,数据怎么恢复?
这个步骤其实是参考《MySQL数据库InnoDB存储引擎Log漫游》
三篇系列文章:http://www.mysqlops.com/2012/04/06/innodb-log1.html
编译MySQL的过程中可看到类似如下的信息,这是在初始化一个数据目录,可观察参数,掌握MySQL编译过程中建立数据目录的过程:
Step 1:
Executing .../mysqld.exe --no-defaults --console --bootstrap
--lc-messages-dir=.../sql/share --basedir=. --datadir=.
--default-storage-engine=MyISAM
--default-tmp-storage-engine=MyISAM --loose-skip-ndbcluster
--max_allowed_packet=8M --net_buffer_length=16K
--loose-skip-auto_generate_certs
--loose-skip-sha256_password_auto_generate_rsa_keys
Step 2:
input file bootstrap.sql, current directory .../sql/data
解析:
1 首先,调用了编译好的mysqld
2 其次, 使用了参数"--bootstrap",表示要生成初始的数据目录.官方对这个参数的解释为:
Used by mysql installation scripts
3 设定数据目录的位置. 如调用参数"--basedir=. --datadir=."
4 …
今天上班就发现一起数据库例行恢复作业失败,失败提示为:“数据库恢复失败”,也就是说是在执行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服务端之间的连接段开,一般来说原因有这么几个:
… |
今天上班就发现一起数据库例行恢复作业失败,失败提示为:“数据库恢复失败”,也就是说是在执行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服务端之间的连接段开,一般来说原因有这么几个:
… |
昨晚半夜处理了一个故障,只是简单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 …
[获取更多]