zoukankan      html  css  js  c++  java
  • MySQL的连接方式、事务、性能优化

    1. mysql一般的连接方式都有哪些,各自优缺点。

    MySQL:过程式风格,最常用。
    MySQLi:MySQL的增强扩展,提供了过程化面向对象两种风格的API,增加了预编译和参数绑定等新特性, 但只支持MySQL。
    PDO:在语法上更接近MySQLi,但PDO扩展只是一个抽象的接口层,利用PDO扩展本身并不能实现任何数据库操作,必须使用一个特定的数据库PDO驱动访问数据库。PDO支持多种数据库,不管访问MySQL还是Oracle,都可以用同样的API对数据进行操作。

    2. 一个pdo类里面,基本上有哪些东西?

    PDO中包含三个预定义类:PDO、PDOStatement和PDOException:
    PDO类:代表一个PHP和数据库之间的连接。

    方法
    PDO - 构造器,构建一个新的PDO对象
    beginTransaction - 开始事务
    commit - 提交事务
    errorCode - 从数据库返回一个错误代号,如果有的话
    errorInfo - 从数据库返回一个含有错误信息的数组,如果有的话
    exec - 执行一条SQL语句并返回影响的行数
    getAttribute - 返回一个数据库连接属性
    lastInsertId - 返回最新插入到数据库的行(的ID)
    prepare - 为执行准备一条SQL语句,返回语句执行后的联合结果集(PDOStatement)
    query - 执行一条SQL语句并返回一个结果集
    quote - 返回添加了引号的字符串,以使其可用于SQL语句中
    rollBack - 回滚一个事务
    setAttribute - 设置一个数据库连接属性

    $dsn = 'mysql:dbname = testdb; host = 127.0.0.1';   // 配置PDO的数据源
    $user = 'dbuser';
    $password = 'dbpass';
    try {
        $dbh = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
    /* 事务处理开始,关闭自动提交事务(autocommit) */
    $dbh->beginTransaction();
    /* 更改数据库结构 */
    $sth = $dbh->exec("DROP TABLE fruit");
    /* 提交事务 */
    $dbh->commit();
    

    PDOStatement类:代表一条预处理语句以及语句执行后的联合结果集(associated result set)。

    方法
    bindColumn - 绑定一个PHP变量到结果集中的输出列
    bindParam - 绑定一个PHP变量到一个预处理语句中的参数
    bindValue - 绑定一个值到与处理语句中的参数
    closeCursor - 关闭游标,使语句可以再次执行
    columnCount - 返回结果集中的列的数量
    errorCode - 从语句中返回一个错误代号,如果有的话
    errorInfo - 从语句中返回一个包含错误信息的数组,如果有的话
    execute - 执行一条预处理语句
    fetch - 从结果集中取出一行
    fetchAll - 从结构集中取出一个包含了所有行的数组
    fetchColumn - 返回结果集中某一列中的数据
    getAttribute - 返回一个 PDOStatement 属性
    getColumnMeta - 返回结果集中某一列的结构(metadata?)
    nextRowset - 返回下一结果集
    rowCount - 返回SQL语句执行后影响的行数
    setAttribute - 设置一个PDOStatement属性
    setFetchMode - 为 PDOStatement 设定获取数据的方式

    PDOException类:对Exception异常基类的重写,返回PDO触发的错误。

    try {
        $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
        foreach ($dbh->query('SELECT * from FOO') as $row) {
            print_r($row);
        }
        $dbh = null;
    } catch (PDOException $e) {
        print "Error!: " . $e->getMessage() . "<br/>";
        die();
    }
    

    3. 事务用来干什么?

    银行转账业务、电子商务支付业务等等。

    比如:
    用户下订单并且已经支付,假设有两张表,订单表和用户账户表。
    当用户点击确认支付的时候需要对这两张表进行操作,如果对订单表的操作成功了、对用户账户表的操作失败了,此时订单状态是已支付,但用户的钱却没扣掉,商家就就亏了。
    这时候如果采用事务,就可以回滚,提示用户支付失败,数据表没有发生任何改动。

    4. 事务的特性都有哪些?

    事务四大特性(简称ACID) :
    原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。
    一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
    隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
    持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

    5. 已给数据库的操作中,怎么能保证这些特性都做到呢?

    MySQL的事务特性就是要求这组操作要不全都成功,要不全都失败。这样就避免了某个操作成功某个操作失败,有利于数据的安全。
    主要有三个操作:
    begin 开始一个事务
    rollback 事务回滚
    commit 事务确认

    在改动数据库之前,我们要开启事务,begin(或start transaction);
    正常执行我们的sql语句;
    当sql语句执行完毕,存在两种情况:
    1)全都成功,我们要将sql语句对数据库造成的影响提交到数据库中,commit;
    2)某些sql语句失败或程序报异常,就捕捉异常,并rollback(回滚),将对数据库操作赶紧撤销,这样数据库里面的数据就不会有任务的编号变化。

    也就是:
    同时更新多个记录,但其中一个更新失败,则全部退回到更新操作开始之前。
    只有全部更新成功,才确认写入DB。

    注:MySQL的事务处理功能在MYSIAM存储引擎中是不支持的,在InnoDB存储引擎中是支持的。

    6. mysql性能优化有哪些?

    优化需要从多方面讲
    1 sql级别的优化
    2 建表的优化
    3 mysql配置的优化
    4 操作系统级别优化
    5 硬件相关优化

    6.1 sql级别的优化
    SQL优化的一般步骤:
    1.通过show status命令了解各种SQL的执行频率。
    2.定位执行效率较低的SQL语句-(重点select)。
    3.通过explain分析低效率的SQL。
    4.确定问题并采取相应的优化措施。

    1)尽量避免在列上进行运算,这样会导致索引失效。
    2)使用join时,应该用小结果集驱动大结果集。同时把复杂的join查询拆分成多个query。因为join多个表时,可能导致更多的锁定和堵塞。
    3)注意Like模糊查询的使用,避免%%。
    4)避免select ,仅列出需要查询的字段,节省内存。
    5)使用批量插入语句节省交互。
    6)limit的基数比较大时使用between。
    7)不要使用rand函数获取多条随机记录。
    8)避免使用NULL。
    9)不要使用count(id),而应该是count(
    )。
    10)不要做无谓的排序操作,而应尽可能在索引中完成排序。

    6.2 建表的优化

    1)一个表不要有太多的字段;
    2)注意字段的命名和数据类型;
    3)数据量过大时考虑分表;
    4)选择合适的数据库引擎。

    选择存储引擎的基本原则如下:

    • 采用MyISAM引擎
      R/W>100:1,且update相对较少;
      并发不高,不需要事物;
      表数据量小;
      硬件资源有限。
    • 采用InnoDB引擎
      R/W比较小,频繁更新大字段;
      表数据量超过1000万,并发高;
      安全性和可用性要求高。
    • 采用Memory引擎
      有足够的内存;
      对数据一致性要求不高,如在线人数和session等应用;
      需要定期归档的数据。

    6.3 mysql配置的优化

    1) 关闭不必要的二进制日志和慢查询日志,仅在内存足够或开发调试时打开它们。
    使用下面的语句查看查询是否打开:

    show variables like '%slow%';
    

    还可以使用下面的语句查看慢查询的条数,定期打开方便优化:

    show global status like '%slow%'; 
    

    2)适度使用Query Cache。
    3)增加MySQL允许的最大连接数。
    4)对于MyISAM表适当增加key_buffer_size,注意table_cache的设置。
    5)对于InnoDB表,注意innodb_buffer_pool_size参数。
    6)从表中删除大量行后,可运行OPTIMIZE TABLE TableName进行碎片整理。

    6.4 操作系统级别优化
    使用64位的系统,因为64位的内存远比32位的内存大。

    6.5 硬件相关优化
    选择好的cpu,好的内存条,ssd硬盘,网络带宽加大。

  • 相关阅读:
    WinForm企业应用框架设计【五】系统登录以及身份验证+源码
    利用windows性能计数器进行服务器性能监控
    WinForm企业应用框架设计【一】界限划分与动态创建WCF服务(no svc!no serviceActivations!)
    杭州驾驶员模拟预约 监控工具 插队工具(准) 请直接联系作者 QQ 412588801
    使用plot绘制实时图表
    SilverLight企业应用框架设计【二】框架画面
    服务器性能监控+邮件发送
    自制安装程序~单文件~可安装windows服务~技巧!类似安装QQ!
    SilverLight企业应用框架设计【四】实体层设计+为客户端动态生成服务代理(自己实现RiaService)
    使用plot绘制可联动的柱状图和饼状图
  • 原文地址:https://www.cnblogs.com/sunshineliulu/p/7361844.html
Copyright © 2011-2022 走看看