3.表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等4. UNION ALL 要比UNION 快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用 UNIONALL。>>UNION 和 UNION ALL 关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。>1. 对重复结果的处理:UNION 在进行表链接后会筛选掉重复的记录,Union All 不会去除重复记录。>2. 对排序的处理:Union 将会按照字段的顺序进行排序;UNION ALL 只是简单的将两个结果合并后就返回。
3.常用索引
1.普通索引: 即针对数据库表创建索引
2.唯一索引: 与普通索引类似,不同的就是:MySQL 数据库索引列的值必须唯一,但允许有空值
3.主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引
4.组合索引: 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。即将数据库表中的多个字段联合起来作为一个组合索引。
4.MySQL数据库索引的工作机制
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树
5.MySQL的基础命令操作
1.MySQL 是否处于运行状态:Debian 上运行命令 service mysqlstatus,在 RedHat上运行命令 service mysqld status
2.开启或停止 MySQL 服务 :运行命令 service mysqld start 开启服务;运行命令service mysqld stop 停止服务
3.Shell 登入 MySQL: 运行命令 mysql -u root -p
4.列出所有数据库:运行命令 show databases;
5.切换到某个数据库并在上面工作:运行命令 use databasename; 进入名为databasename 的数据库
6.列出某个数据库内所有表: show tables;
7.获取表内所有 Field 对象的名称和类型 :describe table_name;
6.MySQL的复制原理及流程
Mysql 内建的复制功能是构建大型,高性能应用程序的基础。将 Mysql 的数据分布到多个系统上去,这种分布的机制,是通过将 Mysql 的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。* 复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。
readbuffersize >是 MySQL 读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL 会为它分配一段内存缓冲区。readbuffersize 变量控制这一缓冲区的大小。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。
14.一张表中仅有一个varchar(N)类型的字段,utf8编码,N的最大值为多少?
由于 utf8 的每个字符最多占用 3 个字节。而 MySQL 定义行的长度不能超过65535,因此 N 的最大值计算方法为:(65535-1-2)/3。减去 1 的原因是实际存储从第二个字节开始,减去 2 的原因是因为要在列表长度存储实际的字符长度,除以 3 是因为utf8 限制:每个字符最多占用 3 个字节。
15.(select *)和(select 全部字段)的优缺点
(select *)要解析数据字典,(select 全部字段)不需要
结果输出顺序,(select *)与建表列顺序相同,(select 全部字段)按指定字段顺序。
表字段改名,(select *)不需要修改,(select 全部字段)需要改
(select 全部字段)可以建立索引进行优化,(select *)无法优化
(select 全部字段)的可读性比(select *)要高
16.having子句和where的异同点
语法上:where 用表中列名,having 用 select 结果别名
影响结果范围:where 从表读出数据的行数,having 返回客户端的行数
索引:where 可以使用索引,having 不能使用索引,只能在临时结果集操作
where 后面不能使用聚集函数,having 是专门使用聚集函数的。
17.MySQL记录不存在时insert,当记录存在是update
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEYUPDATE c=c+1;
18.MySQL中的insert和update的select语法
insert into student (stuid,stuname,deptid)
select 10,'zhangsan',3
from student where stuid > 8;
update student a inner join student b
on b.stuID=10 seta. stuname=concat(b.stuname, b.stuID)
where a.stuID=10 ;