分类
求职面试

三道常见的MySQL数据库面试题

一,对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题:

a)、索引的目的是什么?

快速访问数据表中的特定信息,提高检索速度

创建唯一性索引,保证数据库表中每一行数据的唯一性。

加速表和表之间的连接

使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间

b)、索引对数据库系统的负面影响是什么?

负面影响:

创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。

c)、为数据表建立索引的原则有哪些?

在最频繁使用的、用以缩小查询范围的字段上建立索引。

在频繁使用的、需要排序的字段上建立索引

d)、 什么情况下不宜建立索引?

对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。

对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。

二,简述在MySQL数据库中MyISAM和InnoDB的区别

区别于其他数据库的最重要的特点就是其插件式的表存储引擎。切记:存储引擎是基于表的,而不是数据库。

InnoDB与MyISAM的区别:

InnoDB存储引擎: 主要面向OLTP(Online Transaction Processing,在线事务处理)方面的应用,是第一个完整支持ACID事务的存储引擎(BDB第一个支持事务的存储引擎,已经停止开发)。

特点:

行锁设计、支持外键;

支持类似于Oracle风格的一致性非锁定读(即:默认情况下读取操作不会产生锁);

InnoDB将数据放在一个逻辑的表空间中,由InnoDB自身进行管理。从MySQL4.1版本开始,可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中;

InnoDB通过使用MVCC(多版本并发控制:读不会阻塞写,写也不会阻塞读)来获得高并发性,并且实现了SQL标准的4种隔离级别(默认为REPEATABLE级别);

InnoDB还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能;

InnoDB采用了聚集(clustered)的方式来存储表中的数据,每张标的存储都按主键的顺序存放(如果没有显式的在建表时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键);

InnoDB表会有三个隐藏字段:除了上面提到了6字节的DB_ROW_ID外,还有6字节的DB_TX_ID(事务ID)和7字节的DB_ROLL_PTR(指向对应回滚段的地址)。这个可以通过innodb monitor看到;

MyISAM存储引擎:是MySQL官方提供的存储引擎,主要面向OLAP(Online Analytical Processing,在线分析处理)方面的应用。

特点:

不支持事务,支持表所和全文索引。操作速度快;

MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。MySQL数据库只缓存其索引文件,数据文件的缓存交给操作系统本身来完成;

MySQL5.0版本开始,MyISAM默认支持256T的单表数据;

三,解释MySQL外连接、内连接与自连接的区别

先说什么是交叉连接:交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。

内连接则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。

外连接其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,

这三种情况依次称之为左外连接,右外连接,和全外连接。

左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。

右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。

分类
成长之路

PHP连接MySQL

PHP5及以上版本建议使用以下方式连接MySQL数据库:

  • MySQLi extension这里的i意为improved
  • PDO全称PHP Data Objects

在PHP早期版本中我们使用MySQL扩展,但该扩展在2012年开始不建议使用。

我该用MySQLi,还是PDO呢

如果你需要一个简短的回答,那就“习惯哪个就用哪个”

MySQLi和PDO有它们自己优势:PDO应用在12种不同数据库中,MySQLi只针对MySQL数据库。

所以,如果你的项目需在多种数据库中切换,建议用PDO,这样你只需要修改连接字符串和部分查询语句即可。如使用MySQLi,不同的数据库,需要重新编写所有代码,包括查询。

两者都是面向对象,但MySQLi提供了API接口。

两者都支持预处理语句。预处理语句可以防止SQL注入,对于web项目安全性是非常重要的。

MySQLi和PDO连接MySQL实例

我们用以下三种方式来演示PHP操作MySQL:

  • MySQLi面向对象的方式
  • MySQLi面向过程的方式
  • PDO的方式

MySQLi面向对象的方式:

  1. <?php
  2. $servername = “localhost”;
  3. $username = “username”;
  4. $password = “password”;
  5. // 创建连接
  6. $conn = new mysqli($servername$username$password);
  7. // 检测连接
  8. if ($conn->connect_error) {
  9.     die(“连接失败: “ . $conn->connect_error);
  10. }
  11. echo “连接成功”;
  12. ?>

注意在上面向对象的实例中$connect_error是在PHP5.2.9和5.3.0中添加的。如果你需要兼容更早版本请使用以下代码替换:

  1. // 检测连接
  2. if (mysqli_connect_error()) {
  3.     die(“MySQL数据库连接失败: “ . mysqli_connect_error());
  4. }

MySQLi面向过程的方式:

  1. <?php
  2. $servername = “localhost”;
  3. $username = “username”;
  4. $password = “password”;
  5. // 创建连接
  6. $conn = mysqli_connect($servername$username$password);
  7. // 检测连接
  8. if (!$conn) {
  9.     die(“Connection failed: “ . mysqli_connect_error());
  10. }
  11. echo “连接成功”;
  12. ?>

PDO的方式:

  1. <?php
  2. $servername = “localhost”;
  3. $username = “username”;
  4. $password = “password”;
  5. try {
  6.     $conn = new PDO(“mysql:host=$servername;”$username$password);
  7.     echo “连接成功”;
  8. }
  9. catch(PDOException $e)
  10. {
  11.     echo $e->getMessage();
  12. }
  13. ?>

注意在以上PDO实例中我们已经指定了数据库myDB。PDO在连接过程需要设置数据库名。如果没有指定,则会抛出异常。

关闭连接

MySQLi面向对象的方式:

  1. $conn->close();

MySQLi面向过程的方式:

  1. mysqli_close($conn);

PDO的方式:

  1. $conn = null;
分类
运维教程

不用输入帐号密码登录MySQL的方法

在本地登录mysql,每次都要输入密码,特别麻烦,有没有什么办法可以实现本地免密码登录?我们可以尝试如下操作。

首先进入到当前用户家目录,如root,执行如下命令:

  1. cd
  2. touch .my.cnf

然后再.my.cnf文件中添加如下的内容:

  1. [client]
  2. host=hostname
  3. user=’username’
  4. password=’password’

最后修改一下权限即可:

  1. chmod 700 .my.cnf

博主还没测试,所以没有截图,成功的朋友们记得回个截图,谢谢!