一、WEB
1、网络通讯部分
1.1、TCP 与 UDP 区别?(了解)

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、 基于IP 的传输层协议。
UDP 是 User Datagram Protocol的简称,中文名是用户数据报协议,是 OSI参考模型中的传输层协议,它是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
TCP 和UDP 都是来自于传输层的协议。传输层位于应用层和网络层之间,负责位于不 同主机中进程之间的通信。
TCP 与 UDP 区别

1.TCP 基于连接 UDP 无连接;
2.TCP 要求系统资源较多,UDP 较少;
3.TCP 保证数据正确性,UDP 可能丢包;
4.TCP 保证数据顺序,UDP 不保证。
1.2什么是HTTP协议?
客户端和服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”。
是一个基于请求与响应模式的、无状态的、应用层的协议,基于 TCP 的连接方式。
1.3 TCP的三次握手。
为了准确无误地把数据送达目标处,TCP 协议采用了三次握手策略。

为什么要三次握手?
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是 双方确认自己与对方的发送与接收是正常的。
SYN:同步序列编号(Synchronize Sequence Numbers)。是TCP/IP 建立连接时使用的握手信号。
第一次握手:客户端给服务器发送一个SYN。客户端发送网络包,服务端收到了。服务器得出结论:客户端的发送能力,服务端的接收能力正常。
第二次握手:服务端收到SYN 报文之后,会应答一个SYN+ACK 报文。服务端发包,客户端收到了。客户端得出结论:服务端的接收和发送能力,客户端的接收和发送能力正常。但是此时服务端不能确认客户端的接收能力是否正常。
第三次握手;客户端收到 SYN+ACK 报文之后,回应一个 ACK 报文。客户端发包,服务端收 到了。服务器得出结论:客户端的接收和发送能力,自己的接收发送能力都正常。
通过三次握手,双方都确认对方的接收以及发送能力正常。
1.4 HTTP中重定向和请求转发的区别?
实现
转发:用 request 的 getRequestDispatcher()方法得到 ReuqestDispatcher 对象,调用 forward()方法request.getRequestDispatcher("other.jsp").forward(request, response); 重定向:调用 response的 sendRedirect()方法 response.sendRedirect("other.jsp");
1.重定向2次请求,请求转发 1次请求;
2.重定向地址栏会变,请求转发地址栏不变;
3.重定向是浏览器跳转,请求转发是服务器跳转;
4.重定向可以跳转到任意网址,请求转发只能跳转当前项目;
5.请求转发不会丢失请求数据,重定向会丢失。
1.5 Get和Post的区别?
1.Get 是不安全的,因为在传输过程,数据被放在请求的 URL中;Post 的所有操作对用户来说都是不可见的。
2.Get 传送的数据量较小,一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样, 但相差不大这主要是因为受 URL长度限制;Post 传送的数据量较大,一般被默认为不受限制。
3.Get 限制 Form 表单的数据集的值必须为ASCII 字符;而 Post 支持整个 ISO10646 字符集。
4. Get 执行效率却比 Post 方法好。Get 是form 提交的默认方法。
2、cookie和session的区别?(必会)
1.存储位置不同
cookie存放在客户端电脑,是一个磁盘文件。Ie浏览器是可以从文件夹中找到。session是存放在服务器内存中的一个对象。 chrome 浏览器进行安全处理,只能通过浏览器找到。Session是服务器端会话管理技术,并且 session就是 cookie 实现的。
2.存储容量不同
单个 cookie 保存的数据<=4KB,一个站点最多保存20 个 Cookie。 对于 session来说并没有上限,但出于对服务器端的性能考虑,session 内不要存放过多的 东 西,并且设置session删除机制。
3.存储方式不同
cookie中只能保管 ASCII 字符串,并需要通过编码方式存储为 Unicode 字符或者二进制数 据。 session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。
4.隐私策略不同
cookie对客户端是可见的,别有用心的人可以分析存放在本地的 cookie 并进行cookie 欺 骗,所以它是不安全的。session存储在服务器上,不存在敏感信息泄漏的风险。
5. 有效期上不同
开发可以通过设置 cookie 的属性,达到使 cookie 长期有效的效果。 session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1, 只需关闭窗口该session就会失效,因而 session不能达到长期有效的效果。
6.服务器压力不同
cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie 是很好的选择。 session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分 多,会产生十分多的session,耗费大量的内存。
3、Jsp和Servlet(了解)
3.1、Jsp和Servlet的区别?
相同点
jsp经编译后就变成了 servlet,jsp本质就是 servlet,jvm只能识别 java 的类,不能识别 jsp代码,web 容器将jsp 的代码编译成 jvm能够识别的java 类。其实就是当你通过 http 请求一个 JSP 页面是,首先 Tomcat 会调用 servlet 的service()方法将JSP 编译成为 Servlet,然后执行 Servlet。
不同点
JSP侧重视图,Sevlet 主要用于控制逻辑。
Servlet 中没有内置对象 。
JSP中的内置对象都是必须通过 HttpServletRequest 对象,HttpServletResponse 对象以及HttpServlet 对象得到。
3.2、Servlet的生命周期
// 1. servlet对象创建时,调用此方法public void init(ServletConfig servletConfig);// 2. 用户访问servlet时,调用此方法public void service(ServletRequest servletRequest, ServletResponse servletResponse);// 3. servlet对象销毁时,调用此方法public void destroy();
3.3、JSP九大内置对象
out 对象:用于向客户端、浏览器输出数据。
request对象:封装了来自客户端、浏览器的各种信息。
response 对象:封装了服务器的响应信息。
exception对象:封装了 jsp 程序执行过程中发生的异常和错误信息。
config对象:封装了应用程序的配置信息。
page 对象:指向了当前jsp 程序本身。
session对象:用来保存会话信息。也就是说,可以实现在同一用户的不同请求之间共享数。
application对象:代表了当前应用程序的上下文。可以在不同的用户之间共享信息。 pageContext 对象:提供了对jsp 页面所有对象以及命名空间的访问。
3.4、Ajax和axios的介绍(必会)
Ajax 即"Asynchronous JavaScript And XML"(异步 JavaScript 和 XML),是指一种创 建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新 部分网页的技术。
Ajax应用程序的优势在于:
1. 通过异步模式,提升了用户体验;
2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用;
3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量 下的服务器负载。
axios 是什么?怎样使用它?怎么解决跨域的问题?
axios 的是一种异步请求,用法和ajax 类似,安装 npm install axios --save 即可使用,请 求中包括 get,post,put, patch ,delete 等五种请求方式.
<script> 引入 axios import Axios from 'axios'export default { methods: { testAxios() { const url = 'https://www.baidu.com/'Axios.get(url).then(response => { if (response.data) {console.log(response.data)} }).catch(err => { alert('请求失败') })}}} </script>
axios 是一种异步请求方式,有cdn引入和npm方法引入并使用。
解决跨域常用的有两种方式
1.CORS 解决跨域问题,这需要通过后端来解决,通过设置 header头来通配。使服务器允许跨域请求接口数据,而前端正常使用axios 请求方式。
2.通过接口代理的方式,在vue 项目中创建一个vue.config.js,导入一个 devserve,并配置里面的选项即可。
二、数据库
1、连接查询(必会)
1.左连接 (左外连接)
以左表为基准进行查询,左表数据会全部显示出来,右表 如果和左表匹配 的数 据则显示相应字段的数据,如果不匹配,则显示为 NULL;
2.右连接 (右外连接)
以右表为基准进行查询,右表数据会全部显示出来,右表 如果和左表匹配的数据 则显示相应字段的数据,如果不匹配,则显示为 NULL;
2、聚合函数(必会)
1.聚合函数
SQL中提供的聚合函数可以用来统计、求和、求最值等等。
2.分类
COUNT:统计行数量;
SUM:获取单个列的合计值;
AVG:获取某个列的平均值;
MAX:获取列的最大值;
MIN:获取列的最小值。
3、SQL关键字(必会)
1.分页
MySQL的分页关键词 limit
SELECT * FROM student3 LIMIT 2,6;
查询学生表中数据,从第三条开始显示,显示6条
2.分组
MySQL的分组关键字:group by
SELECT sex, count(*) FROM student3 GROUP BY sex;
3. 去重
去重关键字:distinct
select DISTINCT NAME FROM student3;
4、SQL Select 语句完整的执行顺序: (必会)
查询中用到的关键词主要包含如下展示,并且他们的顺序依次为
form...on...left join...where...group by...avg()/sum()...having..select...
order by...asc/desc...limit...
from: 需要从哪个数据表检索数据;
where: 过滤表中数据的条件;
group by: 如何将上面过滤出的数据分组算结果;
order by : 按照什么样的顺序来查看返回的数据。
5、数据库三范式(必会)
第一范式:1NF 原子性,列或者字段不能再分,要求属性具有原子性,不可再分解;
第二范式:2NF 唯一性,一张表只说一件事,是对记录的惟一性约束,要求记录有惟 一标识,
第三范式:3NF 直接性,数据不能存在传递关系,即每个属性都跟主键有直接关系, 而不是间接关系。
6. 存储引擎 (高薪常问)
1.MyISAM 存储引擎
主要特点:
MySQL5.5 版本之前的默认存储引擎;
支持表级锁(表级锁是 MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁); 不支持事务,外键。
适用场景:对事务的完整性没有要求,或以select、insert 为主的应用基本都可以选用MYISAM。在 Web、数据仓库中应用广泛。
特点:
1、不支持事务、外键;
2、每个myisam 在磁盘上存储为3个文件,文件名和表名相同,扩展名分别是
.frm -------存储表定义
.MYD --------MYData,存储数据
.MYI --------MYIndex,存储索引
2.InnoDB存储引擎
主要特点:
MySQL5.5 版本之后的默认存储引擎;
支持事务;
支持行级锁(行级锁是 Mysql 中锁定粒度最细的一种锁,表示只针对当前操作的行进行加 锁);
支持聚集索引方式存储数据。
7、数据库事务(必会)
1.事务特性
原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
一致性:事务的执行使得数据库从一种正确状态转换成另一种正确状态。
隔离性:在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务。
持久性:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障, 事务的处理结果也会得到保存。
2.隔离级别
(1)读未提交(read Uncommited):
在该隔离级别,所有的事务都可以读取到别的事务中未提交的数据,会产生脏读问题,在项 目中基本不怎么用,安全性太差;
(2) 读已提交(read commited):
这是大多数数据库默认的隔离级别,但是不是 MySQL的默认隔离级别;这个隔离级别满足了简单的隔离要求:一个事务只能看见已经提交事务所做的改变,所以会避免脏读问题; 由于一个事务可以看到别的事务已经提交的数据,于是随之而来产生了不可重复读和虚读等问题(下面详细介绍这种问题,结合问题来理解隔离级别的含义);
(3) 可重复读(Repeatable read):
这是 MySQL的默认隔离级别,它确保了一个事务中多个实例在并发读取数据的时候会读取 到一样的数据;不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB 和 Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
(4) 可串行化(serializable):
事物的最高级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之, 它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争,一 般为了提升程序的吞吐量不会采用这个。
8、索引
1. 索引的概念和优点(了解)
概念:
索引存储在内存中,为服务器存储引擎为了快速找到记录的一种数据结构。索引的主要作用是加快数据查找速度,提高数据库的性能。
优点:
(1) 创建唯一性索引,保证数据库表中每一行数据的唯一性;
(2) 大大加快数据的检索速度,这也是创建索引的最主要的原因;
(3) 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义;
(4) 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
2. 索引的分类(必会)
(1) 普通索引:最基本的索引,它没有任何限制。
(2) 唯一索引:与普通索引类似,不同的就是索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
(3) 主键索引:它是一种特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用 primary key 来约束。
(4) 联合索引(又叫复合索引):多个字段上建立的索引,能够加速复合查询条件的检索。
(5) 全文索引:老版本 MySQL 自带的全文索引只能用于数据库引擎为 MyISAM 的数据表,新版本 MySQL 5.6 的 InnoDB 支持全文索引。默认 MySQL 不支持中文全文检索,可以通过扩展 MySQL,添加中文全文检索或为中文内容表提供 一个对应的英文索引表的方式来支持中文。
3. 索引的底层实现原理(高薪常问)
1. 索引结构
索引是在 Mysql的存储引擎(InnoDB,MyISAM)层中实现的, 而不是在服务层实现的。所以每种存储引擎的索引都不一定完全相同, 也不是所有的存储引擎都支持所有的索引类型的,Mysql目前提供了以下4种索引:
B+Tree 索引: 最常见的索引类型, 大部分索引都支持 B+树索引;
Hash 索引: 只有 Memory引擎支持, 使用场景简单;
R-Tree索引(空间索引): 空间索引是MyISAM引擎的一个特殊索引类型, 主要地理 空间数据, 使用也很少;
S-Full-text(全文索引): 全文索引也是 MyISAM 的一个特殊索引类型, 主要用于全文索引, InnoDB 从Mysql5.6 版本开始支持全文索引。

2. BTree 结构
B+Tree是在BTree基础上进行演变的, 所以我们先来看看BTree, BTree又叫多路 平衡搜索树, 一颗 m叉BTree 特性如下:
(1) 树中每个节点最多包含 m个孩子;
(2) 除根节点与叶子节点外, 每个节点至少有[ceil(m/2)] 个孩子(ceil 函数指向上取整);
(3) 若根节点不是叶子节点, 则至少有两个孩子;
(4) 每个非叶子节点由 n个 Key 和 n+1个指针组成, 其中 [ceil(m/2) -1 ] <= n <= m-1.
以 5叉BTree 为例, key的数量: 公式推导 [ceil(m/2) -1 ] <= n <= m-1。
所以 2 <= n <= 4, 中间节点分裂父节点,两边节点分裂。

3.B+Tree 结构
B+Tree为 BTree 的变种, B+Tree 与BTree的区别:
1.B+Tree 的叶子节点保存所有的 key信息, 依 key 大小顺序排列;
2.B+Tree 叶子节点元素维护了一个单项链表。
所有的非叶子节点都可以看作是 key的索引部分。

由于 B+Tree 只有叶子节点保存 key 信息, 查询任何 key 都要从 root 走的叶子。所以B+Tree查询效率更稳定。
Mysql 中的B+Tree
MySql 索引数据结构对经典的B+Tree 进行了优化, 在原 B+Tree 的基础上, 增加了一个指向相邻叶子节点的链表指针, 就形成了带有顺序指针的B+Tree, 提高区间访问的性能.
MySql 中的B+Tree 索引结构示意图:

4. 如何避免索引失效(高薪常问)
(1) 范围查询, 右边的列不能使用索引, 否则右边的索引也会失效
索引生效案例select * from tb_seller where name = "小米科技" and status = "1" and address = "北京市";select * from tb_seller where name = "小米科技" and status >= "1" and address = "北京市";索引失效案例select * from tb_seller where name = "小米科技" and status > "1" and address = "北京市";
address 索引失效, 因为 status 是大于号, 范围查询。
(2) 不要在索引上使用运算, 否则索引也会失效
比如在索引上使用切割函数, 就会使索引失效。
select * from tb_seller where substring(name, 3, 2) = "科技";
(3) 字符串不加引号, 造成索引失效
如果索引列是字符串类型的整数, 条件查询的时候不加引号会造成索引失效. Mysql 内置的
优化会有隐式转换。
索引失效案例select * from tb_seller where name = "小米科技" and status = 1;
(4) 尽量使用覆盖索引, 避免select *, 这样能提高查询效率
如果索引列完全包含查询列, 那么查询的时候把要查的列写出来, 不使用select *
select sellerid, name, status from tb_seller where name = "小米科技" and staus = "1"and address = "西安市";
(5) or关键字连接
用or分割开的条件, 如果or前面的列有索引,or后面的列没有索引, 那么查询的时候前后索引都会失效。
如果一定要用 or 查询, 可以考虑下or 连接的条件列都加索引, 这样就不会失效了。
索引失效案例:
select * from tb_seller where name = "小米科技" or createTiem = "2018-01-0100:00:00";
9、数据库锁(高薪常问)
1.行锁和表锁
1.主要是针对锁粒度划分的,一般分为:行锁、表锁、库锁
行锁:访问数据库的时候,锁定整个行数据,防止并发错误。
表锁:访问数据库的时候,锁定整个表数据,防止并发错误。
2.行锁和表锁的区别:
表锁: 开销小,加锁快,不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低。
行锁: 开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。
2.悲观锁和乐观锁
(1)悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在 拿数据的时候都会上锁,这样别人想拿这个数据就会block 直到它拿到锁。 传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是 在做操作之前先上锁。
(2)乐观锁: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会 上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等 机制。
乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于 write_condition机制的其实都是提供的乐观锁。
10、MySql优化(高薪常问)

1) 定位执行效率慢的sql语句.(了解)
1.命令:show status like 'Com____',通过这条命令, 我们可以知道当前数据库是以查询为主 还是更新为主. 如果是查询为主, 就重点查询; 如果增删改多就重点优化写入操作.
2.explain + sql语句查询sql执行过程, 通过执行计划,我们能得到哪些信息:
A:哪些步骤花费的成本比较高
B:哪些步骤产生的数据量多,数据量的多少用线条的粗细表示,很直观
C:这条sql语句是否走索引
3.show profile分析SQL,可以查看所有sql语句的执行效率(所用时间). 前提是这个命令需要 被打开, 严格的说也就是打开这个命令后执行的所有sql 语句, 它都能记录下执行时间, 并 展示出来. 可以通过这个命令分析哪些 sql 语句执行效率低. 耗时长, 就更有针对性的优化 这条sql.
4.慢查询日志(常用的工具)
慢查询日志记录了所有执行时间超过参数 long_query_time 的 sql 语句的日志, long_query_time 默认为 10 秒(可以通过配置文件设置), 日志保存在 var/lib/mysql/目录下, 有个slow_query.log 文件。
2) 优化索引(高薪)
2.1 索引设计原则
索引的设计需要遵循一些已有的原则, 这样便于提升索引的使用效率, 更高效的使用索引。
1.对查询频次较高, 且数据量比较大的表, 建立索引;
2.索引字段的选择, 最佳候选列应当从where 子句的条件中提取, 如果 where子句中的组合 比较多, 那么应当挑选最常用, 过滤效果最好的列的组合;
3.使用唯一索引, 区分度越高, 使用索引的效率越高;
4.索引并非越多越好, 如果该表赠,删,改操作较多, 慎重选择建立索引, 过多索引会降低表维 护效率;
5.使用短索引, 提高索引访问时的 I/O 效率, 因此也相应提升了Mysql 查询效率;
6.如果where 后有多个条件经常被用到, 建议建立符合 索引, 复合索引需要遵循最左前缀法则, N个列组合而成的复合索引, 相当于创建了N个索引。
复合索引命名规则 index_表名_列名1_列名2_列明 3
比如:create index idx_seller_name_sta_addr on tb_seller(name, status, address)
2.2 避免索引失效
1.如果在查询的时候, 使用了复合索引, 要遵循最左前缀法则, 也就是查询从索引的最左列开始, 并且不能跳过索引中的列;
2.尽量不要在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描;
3.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描;
4.不做列运算where age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函 数.计算表达式等, 都会是索引失效;
5.查询 like,如果是 ‘%aaa’ 也会造成索引失效;
6.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。
3) Sql语句调优(高薪)
1.根据业务场景建立复合索引只查询业务需要的字段,如果这些字段被索引覆盖,将极大的提高查询效率;
2.多表连接的字段上需要建立索引,这样可以极大提高表连接的效率;
3.where条件字段上需要建立索引, 但Where条件上不要使用运算函数,以免索引失效;
4. 排序字段上, 因为排序效率低, 添加索引能提高查询效率;
5.优化insert 语句: 批量列插入数据要比单个列插入数据效率高;
6.优化 order by 语句: 在使用 order by 语句时, 不要使用 select *, select 后面要查有索引的列, 如果一条sql 语句中对多个列进行排序, 在业务允许情况下, 尽量同时用升 序或同时用降序. 7.优化groupby语句: 在我们对某一个字段进行分组的时候,Mysql默认就进行了排序, 但是排序并不是我们业务所需的, 额外的排序会降低效率. 所以在用的时候可以禁止排序, 使用 order by null 禁用。select age, count(*) from emp group by age order by null;
8.尽量避免子查询, 可以将子查询优化为join多表连接查询。
4) 合理的数据库设计(了解)
根据数据库三范式来进行表结构的设计。设计表结构时,就需要考虑如何设计才能更有效的 查询, 遵循数据库三范式:
i. 第一范式:数据表中每个字段都必须是不可拆分的最小单元,也就是确保每一列的原子性;
ii. 第二范式:满足一范式后,表中每一列必须有唯一性,都必须依赖于主键;
iii. 第三范式:满足二范式后,表中的每一列只与主键直接相关而不是间接相关(外键也是直接相关),字段没有冗余。
注意:没有最好的设计,只有最合适的设计,所以不要过分注重理论。三范式可以作为一个基本依 据,不要生搬硬套。有时候可以根据场景合理地反规范化:
A:保留冗余字段。当两个或多个表在查询中经常需要连接时,可以在其中一个表上增加 若干冗余的字段,以 避免表之间的连接过于频繁,一般在冗余列的数据不经常变动的情况下使用。
B:增加派生列。派生列是由表中的其它多个列的计算所得,增加派生列可以减少统计 运算,在数据汇总时可以大大缩短运算时间, 前提是这个列经常被用到, 这也就是反第三范 式。
C:分割表。
数据表拆分:主要就是垂直拆分和水平拆分。
水平切分:将记录散列到不同的表中,各表的结构完全相同,每次从分表中查询, 提高效率。
垂直切分:将表中大字段单独拆分到另外一张表, 形成一对一的关系。
D: 字段设计
1. 表的字段尽可能用 NOT NULL;
2. 字段长度固定的表查询会更快;
3. 把数据库的大表按时间或一些标志分成小表。




