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硬盘,网络带宽加大。

2017-4-13/MySQL的更多相关文章

  1. easyUI datebox 日期空间斜杠格式化。例如将日期空间中显示2017-03-13,改为2017/03/13

    easyUI datebox 日期空间斜杠格式化 将日期空间中显示2017-03-13,改为2017/03/13 //日期控件斜杠格式化 function formatDate(date){ if( ...

  2. Xamarin 2017.9.13发布更新

     Xamarin 2017.9.13发布更新 Visual Studio 2017更新到15.3.4.其中,Xamarin.Visual更新到4.6.3.4;Xamarin.iOS更新到10.12.3 ...

  3. 2017/11/13 Leetcode 日记

    2017/11/13 Leetcode 日记 463. Island Perimeter You are given a map in form of a two-dimensional intege ...

  4. VR/AR软件—Mirra测试(截至2017/11/13),使AR/VR创作更加便捷

    Mirra(截至2017/11/13)https://www.mirra.co/ 1.主要特点: 目前仅支持VR,不支持AR 在浏览器(仅支持chrome,firefox)上进行创作,但目前不能直接在 ...

  5. LAMP: 分布式 HTTP 2.4.25 + PHP 5.4.13 + MySQL 5.5.28 分离部署

    目录 A. 环境说明:B. 效果截图:C. HTTP编译安装D. MySQL二进制安装E. PHP源码编译安装F. PHP连接HTTPG. PHP支持扩展功能xcacheH. PHP连接MySQLI. ...

  6. Can't find file: './mysql/plugin.frm' (errno: 13)[mysql数据目录迁移错位]错误解决

    大概需要4个步骤,其中第1步通过service mysql stop停止数据库,第4步通过service mysql start启动数据库. 第2步移动数据文件,不知道是否为Ubuntu智能的原因,移 ...

  7. 13.Mysql触发器

    13.触发器13.1 创建触发器定义:触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合.语法:create trigger 触发器名称 触发时机 触发事件 on 表名 ...

  8. mysql 5.7以上版本安装配置方法图文教程(mysql 5.7.12\mysql 5.7.13\mysql 5.7.14)(转)

    http://www.jb51.net/article/90302.htm ******************************* 这篇文章主要为大家分享了MySQL 5.7以上缩版本安装配置 ...

  9. python笔记-13 mysql与sqlalchemy

    一.RDBMS relational database management system 关系型数据库引入 1.数据库的意义 更有效和合理的存储读取数据的一种方式 关系模型基础上的数据库 -> ...

  10. 2017最新安装mysql教程及遇到的问题解决Windows下

    今天因为换了个LINUX系统 把我的E盘不小心给卸载了 结果还是不能用  导致 我E盘里面的mysql也都被删除了    所以又要在次重新装一个MYSQL 了    花了很多时间  也看了很多教程.好 ...

随机推荐

  1. .Net Core项目在Docker上运行,内存占用过多导致pods重启的问题

    默认情况下,.NET Core应用的内存回收模式是Server模式,这种情况下,内存占用和服务器核心数量有关,一半占用量比较大. 我们的应用目前吞吐量都不大,可以采用Workstation模式,这种模 ...

  2. 2、zabbix工作原理及安装配置

      Zabbix架构:zabbix基本术语.zabbix安装.配置和应用 Zabbix架构中的组件: zabbix-server:C语言    zabbix-server和zabbix-agent通过 ...

  3. HDU 5919 Sequence II(主席树+区间不同数个数+区间第k小)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5919 题意:给出一串序列,每次给出区间,求出该区间内不同数的个数k和第一个数出现的位置(将这些位置组 ...

  4. C++使用thread类进行多线程编程

    C++11中引入了一个用于多线程操作的thread类,简单多线程示例: #include <iostream> #include <thread> #include <W ...

  5. 在使用Java8并行流时的问题分析

    最近在使用Java8的并行流时遇到了坑,线上排查问题时花了较多时间,分享出来与大家一起学习与自查 // 此处为坑 List<Java8Demo> copy = Lists.newArray ...

  6. C#引用出错

    今天有朋友问我为什么自己引用了配置文件,但是还不能使用配置文件呢? 之后我查看他的项目,后来发现如下问题,并且总结引用文件流程如下: 引用文件的完整程序如下: 用配置文件举例 项目中的引用右击,然后点 ...

  7. link 和 import的区别

    二者区别: link属于html标签,而@import是css提供的. 页面被加载时,link因为是HTM标签, 把认会同时被加载,而@import引用的css会等到页面加载结束后加载. link是h ...

  8. git的安装以及生成ssh key

    安装git 在ubuntu系统下输入以下命令安装git软件: sudo apt-get install git 输入以下命令查看git是否安装成功: git --version 如下图所示则表示安装成 ...

  9. MySQL学习(四)

    1 MySQL日期和时间类型 创建一个包含DATE类型的表 mysql> create table test3( -> star varchar(20) not null default ...

  10. nRF52832的SAADC

    SAADC部分思维导图 1ADC原理 1.1主要特点 1)8/10/12分辨率,使用过采样可达到14位分辨率 2)多达8个通道 单端输入时使用1个通道,2个通道可组成差分输入 单端和差分输入时均可配置 ...