经过一段时间的NodeJs开发经历,选用的数据库是MySQL,一开始以为自己对数据库的基础知识掌握还ok,因为毕竟自己以前用过Apache+PHP+MySQL做数据库课程设计,但是在开发过程中才知道在这方面的基础非常不扎实,下面把项目中用到的MySQL数据库知识作个总结:
首先在Node环境下开发,一开始是选择mysql模块(https://github.com/mysqljs/mysql),后来该用了easymysql模块,原因可以看Node中使用mysql模块遇到的问题,先小总结下数据库的基础内容吧~
- 在一个数据量很大的表中查询字段或者与一个数据量很大的表建立连接查询时,记得要建立索引
索引,是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
因为笔者之前没有接触过庞大数据库,所以为索引这个概念不是特别有印象,做项目的时候就是因为没有建立索引使用查询sql非常费劲,基本上整个页面都卡住动弹不得,例如,笔者现在这个数据表里面有148893条记录,每条记录有20个字段左右,整个表的大小现在达到了42MB左右,囧,从来没有存过这么大的数据量,但是一个公司的业务数据还远远不止这样。。。。
如果没有查询字段建立索引,页面就如下
但是呢,如果你有对查询字段建立索引,查询基本上都是秒出的,建立索引很简单,如下一点就OK了 - 连接两个表进行更新字段,在MySQL中可以用INNER JOIN...ON....的sql语句
例如:
UPDATE `tableA` a INNER JOIN `tableB` b ON a.`id` = b.`uid` SET a.`order_pay` = b.`order_price` - 将一个数据表复制到另外一个数据表,可以用INSERT INTO的语句
(1)部分字段:
INSERT INTO `tableA`(`字段1`,`字段2`......)
(select `字段1`,`字段2`......
from `tableB`)
(2)全部字段:
INSERT INTO `tableA`
(select *
from `tableB`) - 在MySQL中建立临时表temporaryTable可以用下面sql语句
CREATE TABLE temporaryTable(
SELECT DISTINCT `id`,`sex`
FROM table
); - 关于时间计算,当前日期前一天和后一天,这个在业务需求中也需要用到
(1)后一天
SELECT DATE_ADD('1997-12-31 23:59:59',INTERVAL 1 DAY)
(2)前一天
SELECT DATE_ADD('1997-12-31 23:59:59',INTERVAL -1 DAY) - 判断table表是否存在
SELECT table_name
FROM information_schema.TABLES
WHERE table_name = 'table' - INSERT INTO的用法相信大家都熟悉,但是如果在插入记录过程中有时会因为主键原因而导致查询出错,这个时候可以用INSERT IGNORE INTO语句,加入IGNORE关键字后,当遇到primary duplicate的错误会直接跳过,这样保证了新增的并且没有和主键重复的记录能够顺利插入数据表。
例如,假设在数据表tableA中字段1是主键
INSERT IGNORE INTO `tableA` ( `字段1` , `字段2`。。。 )
SELECT `字段1` , `字段2`。。。
FROM `tableB` - 最后一点想要分享的是在业务需求中用到过的唯一约束,也是在设计数据表结构中很关键的一步
例如,两个字段组合性质的唯一约束
create table table1 (
field1 int,
field2 int,
unique key (field1,field2)
);
以上便是我在项目实战中总结出来的MySQL知识,都是非常基础的知识,但是我相信只有把基础知识都打扎实后,以后才能走得更远。
附一位技术大牛跟我说过的一句话,日后想成为一名独当一面的程序员,要培养兴趣,不怕坑,直面困难。