Mysql详解

时间:2024-06-02 12:31:17

文章目录

    • MySQL概述
    • 存储过程
    • 索引
    • 什么是视图
    • 乐观锁和悲观锁
    • 共享锁和互斥锁
    • 数据库三范式
    • MySQL数据库操作
    • 使用自增ID和UUID作为主键有什么不同
    • MySQL的高可用
    • MySQL 中的隐式转换
    • DDL和DML语句分别代表什么
    • JDBC里的CLOB和BLOB数据类型分别代表什么
    • 外键有什么用,是否该用外键
    • count(*) 和 count(1)和count(指定字段)区别
    • 如果解决 mysql 的乱码问题
    • too many connection 的错误如何解决
    • mysql 常用的性能优化
    • mysql 默认连接超时解决

MySQL概述

MySQL 是一种流行的关系型数据库管理系统 (RDBMS),它被广泛用于各种规模的应用程序和网站开发中。MySQL 提供了高性能、可靠性和易用性,同时具有开源的优势,因此备受开发者和企业的青睐。是一种开放源代码的关系型数据库管理系统
MySQL数据库系统使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理。
下面是 MySQL 的一些重要特性和详解:

  1. 开源性:MySQL 是开源的,可以免费使用,并且其源代码可以被任何人查看、修改和分发。这使得 MySQL 成为了众多开发者和组织的首选数据库解决方案之一。
  2. 跨平台性:MySQL 可以运行在多种操作系统上,包括 Windows、Linux、macOS 等,提供了良好的跨平台支持。
  3. 客户端-服务器架构:MySQL 使用客户端-服务器架构模型,客户端通过发送 SQL 查询和命令来与服务器进行通信,服务器负责管理数据库的存储和处理查询请求。
  4. SQL 支持:MySQL 支持标准的 SQL (Structured Query Language),开发者可以使用 SQL 来操作和管理数据库,包括数据查询、插入、更新、删除等操作。
  5. 存储引擎:MySQL 支持多种存储引擎,每种存储引擎都有其特定的优缺点和适用场景。常见的存储引擎包括 InnoDB、MyISAM、Memory 等。
  6. 事务支持:MySQL 提供了事务的支持,开发者可以使用事务来确保数据库操作的原子性、一致性、隔离性和持久性 (ACID 特性)。
  7. 高性能:MySQL 在处理大量并发请求时表现优异,具有高性能的特点。通过合适的配置和优化,MySQL 可以满足各种性能要求。
  8. 可扩展性:MySQL 支持主从复制、分区、分片等技术,可以实现数据库的水平和垂直扩展,以满足不同规模和负载的需求。
  9. 安全性:MySQL 提供了各种安全功能,包括用户认证、权限管理、数据加密等,可以保护数据库免受未经授权的访问和恶意攻击。
  10. 社区支持和生态系统:MySQL 拥有庞大的开发者社区和生态系统,开发者可以从社区获取支持、学习资源和第三方工具,加速应用程序的开发和部署。
    总的来说,MySQL 是一款功能强大、性能优异、易用可靠的关系型数据库管理系统,适用于各种规模和类型的应用程序开发。通过合理的设计和优化,MySQL 可以帮助开发者构建高效、稳定的数据库应用,并实现数据管理和存储的需求。

存储过程

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程
优点有:
允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。
允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。
减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。
更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。
创建存储过程:

CREATE [ OR REPLACE ] PROCEDURE 存储过程名称
(参数名 类型, 参数名 类型, 参数名 类型)
IS|AS
变量声明部分;
BEGIN
逻辑部分
[EXCEPTION
 异常处理部分]
END;

索引

索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低 i/o 次数,从而提高数据访问性能。
优点:
1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;
2)通过索引,可以大大加快数据的检索速度;
3)通过索引可以加速表和表之间的连接,从而有效实现数据的参考完整性;
4)在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间;
5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
过多创建索引的弊端:
a.创建索引和维护索 引要耗费时间、空间。当数据量比较小时,这种问题还不够突出:而当数据量比较大时,这种 缺陷会比较明显,效率会非常低下。
b.除了数据表占数据空间之外,每一个索引还需要占用一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大,从而造成不必要的空间浪费
c.当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,从而降低了数据的维护速度

什么是视图

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

乐观锁和悲观锁

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

共享锁和互斥锁

共享锁简称S锁,也叫读锁。用于不更改或不更新数据的操作(只读操作),
锁操作需要遵守两个事项:1)先锁后操作;2)事务结束之后必须解锁。

数据库三范式

第一范式:字段具有原子性,不可再分,唯一。所有关系型数据库系统都满足第一范式
第二范式:是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)
要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
第三范式:满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息

MySQL数据库操作

a.创建数据库
语法:create database 数据库名 [character set 字符集 collate 字符集校验规则];
CREATE DATABASE db3 CHARACTER SET utf8 COLLATE utf8_bin;-- 创建一个字符集为utf-8,字符集校验为utf8_bin的数据库叫db3
b.查看数据库
1.show database (查看所有数据库)
2.show create database 数据库名;(查看某一个数据库)
c.创建表
create table 表名称(
字段名 字段类型 约束,
字段名 字段类型 约束,
字段名 字段类型 约束,
… …
);
d.mysql中的数据类型:
Java中的类型 MySQL中的类型
byte/short/int/long tinyint/smallint/int/bigint
float float
double double
boolean bit
char/String char和varchar类型
Date date/time/datetime/timestamp
c.char和varchar的区别:

  • char代表是固定长度的字符或字符串。
  • 定义类型char(8),向这个字段存入字符串hello,那么数据库使用三个空格将其补全。
  • varchar代表的是可变长度的字符串。
    d. 主键约束:primary key
    唯一性约束:unique
    非空约束:not null
    e.关键字是:insert into(增加)
    给某几列插入数据:insert into 表名(列1,列2,列3…) values(值1,值2,值3…);
    给所有列插入数据:insert into 表名values(值1,值2,值3…); 有多少列就写多少个值
    一次性插入多行数据: insert into 表名values(值1,值2,值3…), (值1,值2,值3…), (值1,值2,值3…)…
    f.语法:关键字update(修改)
    update 表名 set 列名1=值1,列名2=值2…[where条件];
    如果没有带条件,那么就是把这一列的值都修改了。
    g. delete from 表名 where 条件
    select * from 表名----------------------------------------------->查询所有信息
    select列1,列2…from 表名--------------------------------->查询某几列的信息
    h.模糊查询使用like关键字
    like可以进行模糊查询,在like子句中可以使用或者%作为占位符。只能代表一个字符,而%可以代表任意个字符。
  • like ‘李_’ :名字中必须是两个字,而且是姓李的。
  • like ‘李%’ :名字中姓李的学生,李字后可以有1个或任意个字符。
  • like ‘%四’ :名字中以四结尾的。
  • like ‘%王%’ :只要名称中包含这个字就可以。
    3、in和between… and…有什么区别
    in:是在给定的几个值之间查询。
    between… and:取介于两个值之间的数据,是在一个范围内查询。相当于where xxx>a and xxx<b;
    4.排序查询
    语法结构:select * from 表名 [where 条件] order by 列名 asc/desc,列名 asc/desc …
    5.聚合函数
    sum(字段名); 查询某一列数据总和
    count(字段名),统计数量
    max(字段名),计算最大值
    min(字段名),计算最小值
    avg(字段名),计算平均值
    6.分组查询的语法结构:group by 字段名
    创建用户
    create user wateruser
    identified by itcast
    default tablespace waterboss

给用户赋权
grant dba to wateruser
创建表
CREATE TABLE 表名称(
字段名 类型(长度) primary key,
字段名 类型(长度),

);

mysql以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。
虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁
mysql在innodb存储引擎的行级锁的情况下才支持事务。

字段加索引
Alter table 表名 index (字段名)
使用alter table语句来为表中的字段添加索引的基本语法是:
ALTER TABLE <表名> ADD INDEX (<字段>);
查询版本信息
SELECT version();

java.util.Date和java.sql.Date有什么区别
java.util.Date包含日期和时间,而java.sql.Date只包含日期信息,而没有具体的时间信息。如果你想把时间信息存储在数据库里,可以考虑使用Timestamp或者DateTime字段。

如何把图片或者原始数据插入到数据库中
可以使用BLOB类型将图片或者原始的二进制数据存储到数据库里。

MySQL下varchar类型最大长度是多少
65535
行列转换

sum(case c2 when ‘B1’ then C3 else 0 end) AS B1
例:
第一种:
SELECT NAME 姓名,
SUM(IF(SUBJECT=‘数学’,score,‘缺考’))数学,
SUM(IF(SUBJECT=‘语文’,score,‘缺考’))语文,
SUM(IF(SUBJECT=‘英语’,score,‘缺考’))英语
FROM stuscore GROUP BY NAME;
第二种:
SELECT NAME AS 姓名,
SUM( CASE SUBJECT WHEN ‘语文’ THEN score ELSE 0 END) AS 语文,
SUM( CASE SUBJECT WHEN ‘数学’ THEN score ELSE 0 END) AS 数学,
SUM( CASE SUBJECT WHEN ‘英语’ THEN score ELSE 0 END) AS 英语
FROM stuscore
GROUP BY NAME;

mysql 常用的日期函数
解析:日期函数太多了,这里应该问的是常用的系统日期函数和关键字。
参考答案:mysql 常用的系统日期函数有now(),sysdate(),curdate()函数
Current_timestamp 关键字。

使用自增ID和UUID作为主键有什么不同

(1)如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的。为了存储和查询性能应该使用自增长id做主键。
(2).对 于InnoDB的主索引,数据会按照主键进行排序,由于UUID的无序性 ,InnoDB会产生巨大的IO压力,此时不适合使用UUID做物理主键,可以把它作为逻辑主键,物理主键依然使用自增ID。为了全局的唯一性,应该用uuid做 索引关联其他表或做外键。

MySQL的高可用

双机主备
一主一从
一主多从
MariaDB 同步多主机
数据库中间件
主从或主主半同步复制
半同步复制优化
高可用架构优化
共享存储
分布式协议
双机主备
优点:一个机器故障了可以自动切换,操作比较简单。
缺点:只有一个库在工作,读写压力大,未能实现读写分离,并发也有一定限制

MySQL 中的隐式转换

MySQL 中的隐式转换是指在查询中将一种数据类型转换为另一种数据类型,以满足表达式的要求。在 MySQL 中,隐式转换是指在比较或运算过程中,当操作数的类型不匹配时,MySQL 自动将其中一个操作数转换为另一个操作数的类型。以下是一些常见的隐式转换情况:
以下是一些常见的隐式转换情况:

  1. 数字和字符串之间的隐式转换:当在一个表达式中将数字和字符串进行比较或连接时,MySQL 会自动将其中一种类型转换为另一种类型。例如,将一个数字和一个字符串相加,MySQL 会将数字转换为字符串或将字符串转换为数字。数字和字符串之间的转换:当进行数字和字符串之间的比较或运算时,MySQL 将字符串转换为数字类型。例如,将字符串 “123” 与数字 456 相加,MySQL 会将字符串转换为数字并执行加法运算。
  2. 字符串和日期之间的隐式转换:MySQL 可以在某些情况下将字符串数据与日期/时间数据进行隐式转换。例如,当在 WHERE 子句中使用日期/时间列时,MySQL 可能会将字符串日期值隐式转换为日期/时间类型进行比较。当进行字符和日期之间的比较或运算时,MySQL 会将字符转换为日期类型。例如,将字符 “2021-01-01” 与日期字段相比较,MySQL 会将字符转换为日期进行比较。
  3. 不同数据类型之间的隐式转换:MySQL 可以在某些情况下将不同的数据类型进行隐式转换。例如,将整数数据类型与浮点数数据类型进行运算时,MySQL 可能会将整数隐式转换为浮点数。
  4. 列类型和查询值之间的隐式转换:当在查询中使用某个列进行条件过滤时,MySQL 可能会将查询值的数据类型与列的数据类型进行隐式转换,以便进行比较或匹配。
  5. NULL 值的处理:当与 NULL 值进行比较或运算时,MySQL 使用特定规则进行隐式转换。例如,NULL 与任何非 NULL 值进行比较时,结果都为 NULL。
    需要注意的是,在某些情况下,隐式转换可能会导致意想不到的结果或性能问题。为了避免隐式转换带来的问题,建议在查询中显式地使用适当的数据类型和函数,以确保预期的结果。此外,在索引列上使用隐式转换也可能导致索引失效,从而影响查询性能。因此,在索引设计中应该注意避免使用隐式转换

DDL和DML语句分别代表什么

DDL(数据定义语言,Data Definition Language)语句用来定义数据库模式。Create,Alter, Drop, Truncate, Rename都属于DDL语句,一般来说,它们是不返回结果的。
DML(数据操作语言,Data Manipulation Language)语句用来操作数据库中的数据。select, insert, update, delete, call等,都属于DML语句。

JDBC里的CLOB和BLOB数据类型分别代表什么

CLOB意思是Character Large OBjects,字符大对象,它是由单字节字符组成的字符串数据,有自己专门的代码页。这种数据类型适用于存储超长的文本信息,那些可能会超出标准的VARCHAR数据类型长度限制(上限是32KB)的文本。
BLOB是Binary Larget OBject,它是二进制大对象,由二进制数据组成,没有专门的代码页。它能用于存储超过VARBINARY限制(32KB)的二进制数据。这种数据类型适合存储图片,声音,图形,或者其它业务程序特定的数据。

外键有什么用,是否该用外键

一:使用外键
优点:
(1)实现表与关联表之间的数据一致性;
(2)可以迅速的建立一个可靠性非常高的数据库结构,而不用让应用程序层去做过多的检查;
(3)可以提高系统鲁棒性、健壮性;
(4)可以实现开发人员和数据库设计人员的分工;
缺点:
(1)数据库需要维护外键的内部管理;
(2)外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
(3)有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
(4)外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;
(5)容易出现数据库I/O的瓶颈;

二:不使用外键
优点:
(1)减少了数据库表与表之间各种关联的复杂性;
(2)牺牲应用服务器资源,换取数据库服务器的性能;
(3)将主动权把控在自己手里;
(4)去掉外键相当于优化数据库性能;

缺点:
(1)所有外键的约束,需要自己在逻辑层自己实现;
(2)会出现数据错误覆写,错误数据进库的情况;
(3)消耗了服务器的性能;
(4)业务层里夹带持久层特性,耦合;
总结:

  1. 互联网行业:不推荐使用外键。
    理由:1)用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不能轻易地水平扩展;
    2)若是把数据一致性的控制放到事务中,即让应用服务器承担此部分的压力;
    3)应用服务器一般都是可以做到轻松地水平的伸缩;
  2. 传统行业:可以使用。
    理由:1)软件应用的人数有限,换句话说是可控的;
    2 数据库服务器的数据量也一般不会超大,且活跃数据有限;

count(*) 和 count(1)和count(指定字段)区别

一、count(1)和count()
当表的数据量比较大,对表作分析之后,使用count(1)比使用count(
)用时多。
从执行计划看,count(1)和count()的效果是一样的。 但是在表做过分析之后,count(1)会比count()的用时少些。
如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。
因为count(
),自动会优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化,所以count(1)和count()基本没有差别。

二、count(1)和count(指定字段)
两者的主要区别是
(1) count(1) 会统计表中的所有的记录数, 包含字段为null 的记录。
(2) count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即 不统计字段为null 的记录。

三、count() 和 count(1)和count(指定字段)区别
执行效果上 :
count(
)包括了所有的列,相当于行数,在统计结果的时候, 不会忽略列值为NULL
count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候, 不会忽略列值为NULL
count(字段)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数, 即某个字段值为NULL时,不统计。
执行效率上:
列名为主键,count(指定字段)会比count(1)快
列名不为主键,count(1)会比count(指定字段)快
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(
如果有主键,则 select count(主键)的执行效率是最优的
如果表只有一个字段,则 select count(
)最优。

如果解决 mysql 的乱码问题

解析:这个题出现频率不高,主要结合应用考察,一般首先要分析说明一下乱码产生的原因是在应用端还是在服务端,然后再解决。
参考答案:1.在安装数据库的过程中将默认的拉丁文–>GBK。
2.在创建数据库时设置选择GBK 或者gb2312。
3.Mysql 安装目录下的my.ini 文件,将 “default-character-set=xxxxx” 中的 xxxxx 改成GBK 或者gb2312。
4.Mysql 安装目录下的\data\databasename(数据库名)\db.opt 文件打开
default-character-set=gbk default-collation=gbk_chinese_ci; 如果上面不是 gbk 和gbk_chinese_ci 则改成支持中文的GBK 或者gb2312。
5.进入 Mysql 的 dos 命令下:进入某数据库后 show full columns from tablename ;查看数据类型,如果不是支持中文的类型则执行 alter table tablename convert to character set gbk 。
6. 在创建数据库时( 用命令创建时)create database databasename
CHARACTER SET gbk(gb2312);

Mysql 有哪些常用命令
像一些数据库连接、授权、DML 操作、数据库备份都可以通过命令完成,这里写一些常用的。
参考答案:1、连接数据库mysql -h 主机地址 -u 用户名 -p 用户密码
2、快捷操作show databses:列出所有的数据库;use databasesname:打开此数据库;show tables:查看当前数据库下面的所有表,然后可以对表进行DML 操作;describe table_name:查看某表下的字段和类型的定义。
3 、在use databasename 状态下导入表SOURCE d:/mysql.sql; 退出命令quit;或者exit

too many connection 的错误如何解决

解析:这是一个实际应用问题,这类的问题无论面试频率是否高,都会在现实工作中遇到,所以建议必须掌握;这里报 too many connection 说明我们的连接数不够用,连接占用时间太长没有释放;解决方法一般是增大连接数,优化查询语句提高查询效率,使用一些缓存策略,对数据库进行集群部署,最不济时可以考虑写文件。 

参考答案:造成too many connection 的直接原因是连接数被占满了,解决这种异常可以通过下面几种方案解决。

  1. 扩大连接数:mysql 的最大连接数默认是100, 这个数值对于并发连接
    很多的数据库应用是远远不够的,可以通过编辑编辑 my.ini 修改 max_connections=1000 增大连接数。
  2. 连接数过多产生的另外一个原因是因为连接没有及时释放或者没释放,可以从以下方面考虑。1、优化相关的SQL 语句,提高执行效率,及时释放连接;2、养成良好的开发习惯,及时的关闭连接;适当使用数据源连接池,减少创建物理连接造成的额外开销;3、适当的使用缓存策略,减少与数据库的直接交互;4、如果有条件可以进行数据集群,增大数据库的吞吐量
  3. 寻找替换方案,比如可以写文件,可以使用内存相关的数据库nosql。

mysql 常用的性能优化

这个经常会被问到,出现频率较高,至少能回答一个三五条,下面列出来一些常用到的优化方法,大家可以选择了解。

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,
5. %xx%和%xx 查询也将导致全表扫描,若要提高效率,可以考虑全文检索或者xx%模糊查询。
6.in 和 not in 也要慎用,否则会导致全表扫描,对于连续的数值,能用 between 就不要用 in 了
7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL 只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时; 它必须在编译时进行选择。
8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
9.应尽量避免在where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
12.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过 6 个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
13.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
14.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
15.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
16.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
17.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
18.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

mysql 默认连接超时解决

解析:这个问题在实际开发中经常用到,笔者之前在一个 OA 项目中也曾经碰到过,mysql 默认有一个时间,超过这个时间,登录就会报超时的异常;这是一个结合实际应用的面试问题。
参考答案: 1、JDBC 连接:connection url 中加参数: autoReconnect=true
jdbc.url=jdbc:mysql://ipaddress:3306/database?autoReconnect=true&autoRe
connectForPools=true(话说只能在mysql5 之前的版本有效,mysql5 之后的版本我没有亲自测试)。

  1. HIBERNATE 连接:需要增加如下属性
    true
    true
    true
  2. 使用c3p0 连接池:(我们的解决方式)
    1
    0
    0
    true
  3. 通过命令修改’wait_timeout’的值(需要重启mysql 服务器): use mysqlname; – 在mysql 库下。
    SHOW GLOBAL VARIABLES LIKE ‘wait_timeout’; – 查看当前值。
    SET GLOBAL wait_timeout = 1814400; – 修改(这里为21 天单位秒)。说明:也可以通过修改mysql 配置文件进行修改(windows-my.ini;linux-my.cnf )