Memcached Functions For MySQL
- 格式:pdf
- 大小:347.90 KB
- 文档页数:39


软件⼯程师面试题-MySQL-V1.01目录前⾔5 MySQL面试题61.MySQL中有哪⼏种锁?62.MySQL中有哪些不同的表格?63.简述在MySQL数据库中MyISAM和InnoDB的区别64.MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?75.CHAR和VARCHAR的区别?76.主键和候选键有什么区别?87.myisamchk是用来做什么的?88.如果一个表有一列定义为TIMESTAMP,将发⽣什么?89.你怎么看到为表格定义的所有索引?810.LIKE声明中的%和_是什么意思?911.列对比运算符是什么?912.BLOB和TEXT有什么区别?913.MySQL_fetch_array和MySQL_fetch_object的区别是什么?914.MyISAM表格将在哪里存储,并且还提供其存储格式?915.MySQL如何优化DISTINCT?1016.如何显示前50⾏?1017.可以使用多少列创建索引?1018.NOW()和CURRENT_DATE()有什么区别?1019.什么是非标准字符串类型?1020.什么是通用SQL函数?1121.MySQL支持事务吗?1122.MySQL里记录货币用什么字段类型好1123.MySQL有关权限的表都有哪⼏个?1224.列的字符串类型可以是什么?1225.MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?1226.锁的优化策略1327.索引的底层实现原理和优化1328.什么情况下设置了索引但⽆法使用1329.实践中如何优化MySQL1330.优化数据库的⽅法1431.简单描述MySQL中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两⽅面)1432.数据库中的事务是什么?1533.SQL注⼊漏洞产⽣的原因?如何防⽌?1634.为表中得字段选择合适得数据类型1635.存储日期时间1636.对于关系型数据库⽽⾔,索引是相当重要的概念,请回答有关索引的⼏个问题:1737.解释MySQL外连接、内连接与自连接的区别1838.Myql中的事务回滚机制概述1839.SQL语⾔包括哪⼏部分?每部分都有哪些操作关键字?1940.完整性约束包括哪些?1941.什么是锁?2042.什么叫视图?游标是什么?2043.什么是存储过程?用什么来调用?2044.如何通俗地理解三个范式?2145.什么是基本表?什么是视图?2146.试述视图的优点?2147.NULL是什么意思2248.主键、外键和索引的区别?2249.你可以用什么来确保表格里的字段只接受特定范围里的值?2250.说说对SQL语句优化有哪些⽅法?(选择⼏条)224软件⼯程师面试题-MYSQL V1.0MySQL面试题1.MySQL中有哪⼏种锁?1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度⼤,发⽣锁冲突的概率最⾼,并发度最低。
mysqlmvcc实现可重复读和读已提交MYSQL ⽇志binlogbinlog⽤于记录数据库执⾏的写⼊性操作(不包括查询)信息,以⼆进制的形式保存在磁盘中。
binlog是mysql的逻辑⽇志,并且由Server层进⾏记录,使⽤任何存储引擎的mysql数据库都会记录binlog⽇志binlog是通过追加的⽅式进⾏写⼊的,可以通过max_binlog_size参数设置每个binlog⽂件的⼤⼩,当⽂件⼤⼩达到给定值之后,会⽣成新的⽂件来保存⽇志。
在实际应⽤中,binlog的主要使⽤场景有两个,分别是主从复制和数据恢复。
主从复制:在Master端开启binlog,然后将binlog发送到各个Slave端,Slave端重放binlog从⽽达到主从数据⼀致。
数据恢复:通过使⽤mysqlbinlog⼯具来恢复数据。
binlog刷盘时机对于InnoDB存储引擎⽽⾔,只有在事务提交时才会记录biglog,此时记录还在内存中,那么biglog是什么时候刷到磁盘中的呢?mysql通过sync_binlog参数控制biglog的刷盘时机,取值范围是0-N:0:不去强制要求,由系统⾃⾏判断何时写⼊磁盘;1:每次commit的时候都要将binlog写⼊磁盘;N:每N个事务,才会将binlog写⼊磁盘。
sync_binlog最安全的是设置是1,这也是MySQL 5.7.7之后版本的默认值。
但是设置⼀个⼤⼀些的值可以提升数据库性能,因此实际情况下也可以将值适当调⼤,牺牲⼀定的⼀致性来获取更好的性能。
binlog⽇志有三种格式,分别为STATMENT、ROW和MIXED。
STATMENT。
基于SQL语句的复制(statement-based replication, SBR),每⼀条会修改数据的sql语句会记录到binlog中。
优点:不需要记录每⼀⾏的变化,减少了binlog⽇志量,节约了IO, 从⽽提⾼了性能;缺点:在某些情况下会导致主从数据不⼀致,⽐如执⾏sysdate()、slepp()等。
<?//========================================== // 文件: SimpleDB.class.php// 程序: MySQL数据库操作类// 作者: heiyeluren </heiyeshuwu// 时间: 2006-09-20//==========================================class SimpleDB{/*** 连接标识* @var resource*/var $dbLink;/*** 数据库查询语句* @var string*/var $dbSql;/*** 查询结果* @var resource*/var $dbResult;/*** 查询记录集* @var array*/var $dbRecord;/*** 数据库字符集* @var string*/var $dbCharset = 'GBK';/*** 数据库结果集提取方式* @var int*/var $fetchMode = MYSQL_ASSOC;/*** 日志保存路径* @var string*/var $logPath = '/tmp/mysql_log';/*** 是否记录SQL查询失败的SQL日志,缺省是false* @var bool*/var $isLog = false;/*** 是否在SQL查询出错的时候显示错误并且终止脚本执行,缺省是true** @var bool*/var $isError = true;//--------------------------// 内部接口//--------------------------/*** 构造函数** @param string $db_host 连接主机* @param string $db_user 连接用户* @param string $db_passwd 数据库密码* @param string $db_name 数据库* @param bool $is_pconnect 是否长连接,默认是否* @return SimpleDB*/function SimpleDB($db_host, $db_user, $db_passwd, $db_name, $is_pconnect=false){ $this->connect($db_host, $db_user, $db_passwd, $db_name, $is_pconnect);}/*** 连接数据库** @param string $db_host 数据库主机地址,例如:localhost,或者localhost:3306* @param string $db_user 连接数据库的用户* @param string $db_passwd 用户密码* @param string $db_name 数据库名字* @param boo $is_pconnect 是否使用长连接* @return resource 返回连接资源标识符*/function connect($db_host, $db_user, $db_passwd, $db_name, $is_pconnect){ if ($is_pconnect){return $this->dbLink = @mysql_pconnect($db_host, $db_user, $db_passwd);}$this->dbLink = @mysql_connect($db_host, $db_user, $db_passwd);@mysql_select_db($db_name, $this->dbLink);$mysql_version = $this->getOne("SELECT VERSION()");if ($this->dbCharset!='' && preg_match("/^(5.|4.1)/", $mysql_version)){ $this->query("SET NAMES '$this->dbCharset'", $this->dbLink);}return $this->dbLink;}/*** 关闭数据库连接** @return bool 是否成功关闭连接*/function disconnect(){$ret = @mysql_close($this->dbLink);$this->dbLink = null;return $ret;}/*** 设置查询结果返回数据类型** @param int $modeType 设置查询结果返回设置,1为关联索引和数字所有都有,2为使用关联索引,3为使用数字索引*/function setFetchMode($modeType){switch ($modeType){case 1: //数字索引和关联索引都有$this->fetchMode = MYSQL_BOTH;break;case 2: //使用关联索引$this->fetchMode = MYSQL_ASSOC;break;case 3: //使用数字索引$this->fetchMode = MYSQL_NUM;break;default://缺省使用关联索引$this->fetchMode = MYSQL_ASSOC;}}* 设置数据库客户端提取结果集的字符编码** @param string $charset 编码的字符串,比如UTF8,GBK之类的,缺省是GBK */function setCharset($charset){if ($charset != ''){$this->dbCharset = $charset;}}/*** 设置日志存储路径** @param string $log_path 日志路径,该必须是可写的*/function setLogPath($log_path){if ($log_path != ''){$this->logPath = $log_path;}}/*** 写SQL执行日志** @param string $sql 查询的SQL语句* @param string $file 当前执行查询的文件*/function writeLog($sql, $file){if (!file_exists($this->logPath)){@mkdir($this->logPath);}$log_file = $this->logPath ."/mysql_".date("Y-m-d").".log";$log_msg = "[".date("Y-m-d H:i:s")."] - ".$file.": ".$sql." ";error_log($log_msg, 3, $log_file);}/*** 显示上依次SQL执行错误的错误信息*/function showError(){$errMessage = "MySQL query error ". mysql_errno($this->dbLink) .": ". mysql_error($this->dbLink);die($errMessage);/*** 返回MySQL的版本信息** @return string Mysql的版本*/function getVersion(){return $this->getOne("SELECT VERSION()");}/*** 查询操作的底层接口** @param string $sql 要执行查询的SQL语句* @return bool 执行成功返回true,失败返回false*/function query($sql){$this->dbSql = $sql;$this->dbResult = null;$this->dbResult = @mysql_query($sql, $this->dbLink);if ($this->dbResult === false){if ($this->isLog){$this->writeLog($sql, __FILE__);}if ($this->isError){$this->showError();}return false;}return true;}//--------------------------// 数据获取接口//--------------------------/*** 获取SQL执行的全部结果集(二维数组)** @param string $sql 需要执行查询的SQL语句* @return 成功返回查询结果的二维数组,失败返回false*/function getAll($sql){if (!$this->query($sql)){return false;}$this->dbRecord = array();while ($row = @mysql_fetch_array($this->dbResult, $this->fetchMode)) { $this->dbRecord[] = $row;}@mysql_free_result($this->dbResult);if (!is_array($this->dbRecord) || empty($this->dbRecord)){return false;}return $this->dbRecord;}/*** 获取单行记录(一维数组)** @param string $sql 需要执行查询的SQL语句* @return 成功返回结果记录的一维数组,失败返回false*/function getRow($sql){if (!$this->query($sql)){return false;}$this->dbRecord = array();$this->dbRecord = @mysql_fetch_array($this->dbResult, $this->fetchMode);@mysql_free_result($this->dbResult);if (!is_array($this->dbRecord) || empty($this->dbRecord)){return false;}return $this->dbRecord;}/*** 获取一列数据(一维数组)** @param string $sql 需要获取的字符串* @param string $field 需要获取的列,如果不指定,默认是第一列* @return 成功返回提取的结果记录的一维数组,失败返回false*/function getCol($sql, $field=''){if (!$this->query($sql)){return false;}$this->dbRecord = array();while($row = @mysql_fetch_array($this->dbResult, $this->fetchMode)){ if (trim($field) == ''){$this->dbRecord[] = current($row);} else {$this->dbRecord[] = $row[$field];}}@mysql_free_result($this->dbResult);if (!is_array($this->dbRecord) || empty($this->dbRecord)){ return false;}return $this->dbRecord;}/*** 获取一个数据(当条数组)** @param string $sql 需要执行查询的SQL* @return 成功返回获取的一个数据,失败返回false*/function getOne($sql, $field=''){if (!$this->query($sql)){return false;}$this->dbRecord = array();$row = @mysql_fetch_array($this->dbResult, $this->fetchMode);@mysql_free_result($this->dbResult);if (!is_array($row) || empty($row)){return false;}if (trim($field) != ''){$this->dbRecord = $row[$field];}else{$this->dbRecord = current($row);}return $this->dbRecord;}/*** 获取指定各种条件的记录** @param string $table 表名(访问的数据表)* @param string $field 字段(要获取的字段)* @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)* @param string $order 排序(按照什么字段排序,不包括ORDER BY,默认为空)* @param string $limit 限制记录(需要提取多少记录,不包括LIMIT,默认为空)* @param bool $single 是否只是取单条记录(是调用getRow还是getAll,默认是false,即调用getAll)* @return 成功返回记录结果集的数组,失败返回false*/function getRecord($table, $field='*', $where='', $order='', $limit='', $single=false){ $sql = "SELECT $field FROM $table";$sql .= trim($where)!='' ? " WHERE $where " : $where;$sql .= trim($order)!='' ? " ORDER BY $order" : $order;$sql .= trim($limit)!='' ? " LIMIT $limit" : $limit;if ($single){return $this->getRow($sql);}return $this->getAll($sql);}/*** 获取指点各种条件的记录(跟getRecored类似)** @param string $table 表名(访问的数据表)* @param string $field 字段(要获取的字段)* @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)* @param array $order_arr 排序数组(格式类似于: array('id'=>true), 那么就是按照ID为顺序排序, array('id'=>false), 就是按照ID逆序排序)* @param array $limit_arr 提取数据的限制数组()* @return unknown*/function getSpecifyRecord($table, $field='*', $where='', $order_arr=array(),$limit_arr=array()){$sql = "SELECT $field FROM $table";$sql .= trim($where)!='' ? " WHERE $where " : $where;if (is_array($order_arr) && !empty($order_arr)){$arr_key = key($order_arr);$sql .= " ORDER BY $arr_key " . ($order_arr[$arr_key] ? "ASC" : "DESC");}if (is_array($limit_arr) && !empty($limit_arr)){$start_post = intval(array_shift($limit_arr));$offset = intval(array_shift($limit_arr));$sql .= " LIMIT $start_post,$offset";}return $this->getAll($sql);}/*** 获取指定条数的记录** @param string $table 表名* @param int $start_pos 开始记录* @param int $offset 偏移量* @param string $field 字段名* @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)* @param string $order 排序(按照什么字段排序,不包括ORDER BY,默认为空)* @return 成功返回包含记录的二维数组,失败返回false*/function getLimitRecord($table, $start_pos, $offset, $field='*', $where='', $oder=''){ $sql = "SELECT $field FROM $table";$sql .= trim($where)!='' ? " WHERE $where " : $where;$sql .= trim($order)!='' ? " ORDER BY $order" : $order;$sql .= "LIMIT $start_pos,$offset";return $this->getAll($sql);}/*** 获取排序记录** @param string $table 表名* @param string $order_field 需要排序的字段(比如id)* @param string $order_method 排序的方式(1为顺序, 2为逆序, 默认是1)* @param string $field 需要提取的字段(默认是*,就是所有字段)* @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)* @param string $limit 限制记录(需要提取多少记录,不包括LIMIT,默认为空)* @return 成功返回记录的二维数组,失败返回false*/function getOrderRecord($table, $order_field, $order_method=1, $field='*', $where='', $limit=''){//$order_method的值为1则为顺序, $order_method值为2则2则是逆序排列$sql = "SELECT $field FROM $table";$sql .= trim($where)!='' ? " WHERE $where " : $where;$sql .= " ORDER BY $order_field " . ( $order_method==1 ? "ASC" : "DESC");$sql .= trim($limit)!='' ? " LIMIT $limit" : $limit;return $this->getAll($sql);}/*** 分页查询(限制查询的记录条数)** @param string $sql 需要查询的SQL语句* @param int $start_pos 开始记录的条数* @param int $offset 每次的偏移量,需要获取多少条* @return 成功返回获取结果记录的二维数组,失败返回false*/function limitQuery($sql, $start_pos, $offset){$start_pos = intval($start_pos);$offset = intval($offset);$sql = $sql . " LIMIT $start_pos,$offset ";return $this->getAll($sql);}//--------------------------// 无数据返回操作//--------------------------/*** 执行执行非Select查询操作** @param string $sql 查询SQL语句* @return bool 成功执行返回true, 失败返回false*/function execute($sql){if (!$this->query($sql)){return false;}$count = @mysql_affected_rows($this->dbLink);if ($count <= 0){return false;}return true;}/*** 自动执行操作(针对Insert/Update操作)** @param string $table 表名* @param array $field_array 字段数组(数组中的键相当于字段名,数组值相当于值, 类似array( 'id' => 100, 'user' => 'heiyeluren')* @param int $mode 执行操作的模式(是插入还是更新操作, 1是插入操作Insert, 2是更新操作Update)* @param string $where 如果是更新操作,可以添加WHERE的条件* @return bool 执行成功返回true, 失败返回false*/function autoExecute($table, $field_array, $mode, $where=''){if ($table=='' || !is_array($field_array) || empty($field_array)){ return false;}//$mode为1是插入操作(Insert), $mode为2是更新操作if ($mode == 1){$sql = "INSERT INTO $table SET ";}else{$sql = "UPDATE $table SET ";}foreach ($field_array as $key => $value){$sql .= "$key='$value',";}$sql = rtrim($sql, ',');if ($mode==2 && $where!=''){$sql .= "WHERE $where";}return $this->execute($sql);}//--------------------------// 其他数据相关操作//--------------------------/*** 获取最后一次查询的SQL语句** @return string 返回最后一次查询的SQL语句*/function getLastSql(){return $this->dbSql;}/*** 获取上次插入操作的的ID** @return int 如果没有连接或者查询失败,返回0, 成功返回ID*/function getLastId(){if (!$this->dbLink){return 0;}if (($last_id = mysql_insert_id($this->dbLink)) > 0){ return $last_id;}return $this->getOne("SELECT LAST_INSERT_ID()");}/*** 获取记录集里面的记录条数(用于Select操作)** @return int 如果上一次无结果集或者记录结果集为空,返回0, 否则返回结果集数量*/function getNumRows(){if (!$this->dbResult){return 0;}return mysql_num_rows($this->dbResult);}/*** 获取受到影响的记录数量(用于Update/Delete/Insert操作)** @return int 如果没有连接或者影响记录为空, 否则返回影响的行数量*/function getAffectedRows(){if (!$this->dbLink){return 0;}return mysql_affected_rows($this->dbLink);}}?>。
数据库MySQL常见⾯试问题数据库MySQL常见⾯试问题1.MySQL 主键与索引的联系与区别主键是为了标识数据库记录唯⼀性,不允许记录重复,且键值不能为空,主键也是⼀个特殊索引。
数据表中只允许有⼀个主键,但是可以有多个索引。
使⽤主键会数据库会⾃动创建主索引,也可以在⾮主键上创建索引,⽅便查询效率。
索引可以提⾼查询速度,它就相当于字典的⽬录,可以通过它很快查询到想要的结果,⽽不需要进⾏全表扫描。
主键索引外索引的值可以为空。
主键也可以由多个字段组成,组成复合主键,同时主键肯定也是唯⼀索引。
唯⼀索引则表⽰该索引值唯⼀,可以由⼀个或⼏个字段组成,⼀个表可以有多个唯⼀索引。
2.数据库索引是怎么回事?⽤的啥数据结构为什么B+树⽐B树更合适⼀个索引是存储的表中⼀个特定列的值数据结构(最常见的是B-Tree)。
索引是在表的列上创建。
所以,要记住的关键点是索引包含⼀个表中列的值,并且这些值存储在⼀个数据结构中。
请记住记住这⼀点:索引是⼀种数据结构。
什么样的数据结构可以作为索引?B-Tree 是最常⽤的⽤于索引的数据结构。
因为它们是时间复杂度低,查找、删除、插⼊操作都可以可以在对数时间内完成。
另外⼀个重要原因存储在B-Tree中的数据是有序的。
数据库管理系统(RDBMS)通常决定索引应该⽤哪些数据结构。
但是,在某些情况下,你在创建索引时可以指定索引要使⽤的数据结构。
当我们利⽤索引查询的时候,不可能把整个索引全部加载到内存,只能逐⼀加载每个磁盘页,磁盘页对应索引树的节点。
那么Mysql衡量查询效率的标准就是磁盘IO次数。
如果我们利⽤作为索引结构,那么磁盘的IO次数和索引树的⾼度是相关的。
那么为了提⾼查询效率,就需要减少磁盘IO数。
为了减少磁盘IO的次数,就需要尽量降低树的⾼度,需要把原来“瘦⾼”的树结构变的“矮胖”,树的每层的分叉越多越好,因此B树正好符合我们的要求,这也是B-树的特征之⼀。
B树 B树的节点为关键字和相应的数据(索引等)B+树 B+树是B树的⼀个变形,⾮叶⼦节点只保存索引,不保存实际的数据,数据都保存在叶⼦节点中,B+树的叶⼦节点为,放数据,⾮叶⼦节点是索引。