初体验
自己以前习惯在实践中总结,后来无意中浏览了下完整MySQL官方文档,发现自己走了很多弯路。
官方文档非常齐全,各种功能/函数清单、重要原理/主题拆解、常用场景/问题及优化方案等等。
看完了自己一度很沮丧,一是文档的内容详实、又很好理解,自己以前走了太多弯路;二是文档行文思路流畅、例子简单有效,比自己总结的笔记和博客高级好多。(此处是生无可恋脸)
一定积累后
后来又经过了几年的工作,开始慢慢发现官方文档作为入门、甚至平时的参考手册都可以,但是实际项目中大量的复杂案例是官方文档缺少的,要形成复杂的解决方案、往往需要文档中多个知识点、按一定套路去组合实践,这也是很有价值的。再就是文档虽然通俗易懂,但是每个人的思维结构不同,我自己整理的笔记和博文,过段时间自己拿来回顾、还是比看官方文档要快。所以终于还是写博客来分享,虽然官方文档珠玉在前,但是自己的文章也可以发挥些作用:
- 可能有和自己思路接近的朋友,看我的文章上手快了些
- 有些正好遇到复杂场景的朋友,看手册思考无果,可能看了我的博客恰好有了参考
- 给大家介绍下官方手册,让更多后来的朋友,少走些我走过的弯路。
总结
官方手册地址:https://dev.mysql.com/doc/refman/8.0/en/manual-info.html
目前我对手册的使用还很片面,还有很多作用没有挖掘出来,包括内部手册、源代码手册等;
内部手册:https://dev.mysql.com/doc/internals/en/
源代码手册:https://dev.mysql.com/doc/dev/mysql-server/latest/
相比于文档的好用,mysql workbench真的是难用的一匹。
附录:一些小技巧
要判断函数在哪个版本支持
可以在MySQL官方的《函数和运算符参考文档》中查找、对比不同版本。
将案例表格转化成建表语句
在Chrome DevTools直接执行javascript脚本:
function parseTextToSql(domElement, tableName) {
var children = domElement.getElementsByClassName("token output");
var sql = "insert into " + tableName + " ";
for( var i = 0, l = children.length;i<l;i++) {
if(i==0||i==2||i==l-1) continue
var row = children[i].innerText.replace(/^\|\s*|\s*\|$/g, "");
if(i==1){
sql += "(" + row.replace(/\s*\|\s*/g, ",") + ") values\n";
} else {
sql += "('" + row.replace(/\s*\|\s*/g, "','") + "')";
sql += (i==l-2 ? ";" : ",\n");
}
}
console.log(sql);
}
parseTextToSql($0, "sales");
例如窗口函数文档中https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html,有一大段表格,执行上述语句后,得到了数据初始化语句(建表语句一般随文会提供):
insert into sales (year,country,product,profit) values
('2000','Finland','Computer','1500'),
('2000','Finland','Phone','100'),
('2001','Finland','Phone','10'),
('2000','India','Calculator','75'),
('2000','India','Calculator','75'),
('2000','India','Computer','1200'),
('2000','USA','Calculator','75'),
('2000','USA','Computer','1500'),
('2001','USA','Calculator','50'),
('2001','USA','Computer','1500'),
('2001','USA','Computer','1200'),
('2001','USA','TV','150'),
('2001','USA','TV','100');
这样就可以自由的使用文档的例子,验证文档所述的场景和功能了。