zoukankan      html  css  js  c++  java
  • node连接mysql数据库-05

    数据库:

    1.分类(按照最主要特征去分类)

      1)文件型数据库(就是一个文件,可以很方便的拷贝) 不适合存储大量的数据。适合单机存储少量数据。

      access、sqlite(对系统占用空间极小)

      2)关系型数据库:强调数据之间是有关系,功能很强大,但性能会下降。

      mysql、Oracle

      3)分布式数据库:可以把数据库安装在各个机器上,安全性是比较高的,一般会做备份,一般会备三份,如果全丢的可能性不太大,这时候如果任何一台机器死了,数据没法恢复,你再放一台新的机器上去,他会自动的把数据同步过去。

      特点:单机的性能不一定好,但是可以通过堆积器来堆堆堆,最后总体的性能吞吐量非常的高

      mongoDB

      4)NoSQL:砍掉了复杂的查询,无法支持复杂的查询,不用那么多的功能,但是性能高,一般系统的性能高低都在数据库这。支持高并发。

      memcache、redis

    一个项目中可以根据需要,使用不同的数据库。比如:客户端用sqlite用来缓存一些数据(包括提交失败的,包括用户断网的),置于后台,用Oracle或者mysql。还可以用redis当外壳,因为数据不可能都每次找mysql要(对mysql的压力很大),是用redis当缓存(存储最近一段时间的数据,热门数据等),这样就降低了主数据库mysql的负载。

    如果比较简单的项目,就使用一种数据库就行了,比如mysql。

    2.安全性

      注入攻击

    3.操作

      管理型

      增删改查

    管理工具:可视化操作数据库

      navicat

    类型:

      数字:int

      文本: varchar  -> 短的字符串

           text  -> 大量字符串

    索引的作用:

    1.性能

      1)主键 : = 唯一 + 索引

      2)唯一 :Unique(不重复)

      3)索引:提高查询性能,但降低其他操作(新增和删除)的性能,更占空间

      4)全文索引:适合文本搜索

    主键 = 唯一 + 索引

    2.限制和约束

    node操作数据库:

    通常情况下,数据库和web前端机(不是指浏览器,说的是对用户直接提供访问的服务器),一般情况下,web前端机和数据库一定不是在一台机器上,为什么?

    1)因为web前端机的风险更高,他会直接接受用户的访问,所以不会把数据库放在他上面去,否则很容易把数据库暴露出去  

    2)一般情况下,web前端机很多,把数据库部署上去会涉及到分布式的各种事。

    3)前端主机的资源消耗比较大(要做缓存,磁盘内存都比较忙)数据库放在前端机上性能会低

    所以一般情况下,nodeJs和数据库之间都是通过网络来交换数据,因为他们不在一台主机上面。

    nodejs操作数据库也是异步的

    如果也是异步的,我们操作数据库的时候得想办法变成promise认识的状态,变成同步化。

    node 安装数据库:

    1) npm init -y    -> 初始化

    2)npm i mysql -D ;  -> 安装  (这个安装的是mysql库的版本,而不是mysql服务器的版本)

    node连接mysql的必要条件:

    1.需要电脑上有mysql服务器(可以单独下载mysql,也可以用phpstudy,phpstudy中自带的有mysql)

    2.npm 安装mysql的库,用于引入mysql模块,连接mysql数据库

    3.可以用navicat数据库工具查看数据库(一般创建数据库,都用他,基本不在node中创建数据库,太麻烦)

     

     添加成功data会出现一个这样的信息: 一般里面的insertID最常用,返回给前端。

     

     接下来,我们要做一个前端填写用户名密码登录注册,后端收到数据进行校验,校验成功后存储到数据库:

    前端:ajax发送数据,默认get方式

     后端:判断存储

     前端提交:

     数据库:存储到了xiaohong 这条数据

    综上:我们其实有两个问题需要解决

    问题1) 当同时连接数过多时,只有一个连接,一个卡住,其他都跟着等着,性能不好。

    我们使用了一个叫做createConnection来跟服务器建立连接

    let db = mysql.createConnection({ }),这样做是没问题的,但是有个小小的问题,你可以想象咱们现在的这个服务器是跟数据库之间是只有当前自己的一个连接,如果有几十个用户同时访问这个服务器,那么当前面有个用户的请求比较大,卡住了,那么这几十个用户的请求都得排队等着,为什么呢?因为这个db这个东西它一次只能执行一个请求,如果这一个请求没完,它下一次再请求会卡住。直到前一次完事,下一次才能开始,这个是它的问题,所以如果我们真想要提高操作数据库的性能,我们可以做连接池,何谓连接池呢?就是我跟服务器一次建立建立比如十条、五十条连接,需要请求的时候,从这个池子(其实就一个数组)里面拿出一个空闲的连接来,然后就用,等用完了,再把它放回去,这样的话就能保持连接一直存在,这样就既不用每次碰到请求还要现去连接,这样会慢,而且负载还重,也不会轻易的被卡主,当然有可能这十条、五十条连接都被卡住了,但总体来说还是比一条连接概率要低的多,所以我们要做 建立多条连接,并且还用完还要放回连接池等一系列的事,但是这些我们自己做显然不太可能,我们可以用一个叫做createPool的方法,这个createPool可以自动的帮我们建立一个连接池,不需要我们来管,他会自动的替我们管理这里面的连接。当然他比createConnection连接也多了一个参数:connectionLimit : 10(最大连接数,可以是任意值,但是值越大会加重数据库服务器的负担,通常10就够了) ,这个参数默认值就是10,如果不额外修改,就可以省略掉这个参数
    mysql.createPool({
      connectionLimit : 10,  //默认10,这个参数可以省略
      host : '',      //域名 
      user : '',     //数据库账号
      password : '', //数据库密码
      port : '',    //如果默认端口号3306,port参数可以省略,加了就可以自己定义当前连接数据的端口号(与要连接的数据库保持一致)
      database : '' //连接的数据库名字
    })

     问题2)操作数据库中全都是用回调函数,虽然可行,node中操作数据库的机制也是这样的,但是太麻烦了,尤其是复杂操作

    解决办法:co-mysql ,他是另外一个模块,这个模块没有办法独立的来使用,他实际上不是一个mysql,他实际上是一个mysql的一个封装,可以把普通连接封装成可以做异步调用的连接。 

    使用要先安装: npm i co-mysql -D ;

    引入:const co=require('co-mysql');

    使用:把原来的连完的连接包裹一下;

          let conn=mysql.createPool({});
          let db=co(conn);

     因为用了async和await 我们用try catch包裹,捕获错误信息。

    综上:对于用户名和密码的校验注册和登录都要用到,所以我们要把他提出去,引入进来。

    最后思考:

    为什么node和mysql建立连接的时候,也就是

    let db = mysql.createConnection({  .... })
    这个db是用来去操作数据库的,为什么不能直接去用异步,而是现有的回调函数?
      -- 是因为回调函数中,如果再有其他增删改查的操作,还会有回调函数,这样就成了多层嵌套,非常不容易维护:如下图:
       

       所以我们要通过co-mysql,使原来的db包装成promise对象,这样就可以使用async和await了,这样写就更扁平化,让人利于理解和维护。

      -- 还有就是这个mysql库是开源框架,并不是商业用途,作者爱写成啥样就什么样,他希望保持这个库比较干净,比较纯粹,并没有把异步特征给加进去,还因为mysql出的比较早,那个年代还不流行async,await,promise这些,后来也没改,一般开源库的作者后期很少改动,万一改出事就麻烦了。后期可以用模块去补充,如现在的co-mysql。
     
     
  • 相关阅读:
    JS Table排序类
    JavaScript使用技巧精萃
    修改鄒建 老師的SQL PivotTable,增加同分組非交叉欄位
    类似gmail添加附件
    [转贴]Js中 关于top、clientTop、scrollTop、offsetTop等
    Three Tier Code generation with Codesmith
    SQL中取得漢字拼音首字母或五筆首鍵編碼
    (转)ComputerStyle与currentStyle的区别
    html css样式色彩解析
    js 拖拽效果
  • 原文地址:https://www.cnblogs.com/haoqiyouyu/p/14264386.html
Copyright © 2011-2022 走看看