目录
MySQL简介
(1)库操作(database)
(2)表操作:(table)
(3)数据操作:(insert into)
(4)字符集和校对规则
(5)数据定义类型总汇
整数型:
浮点数:
字符串:
大文本类型:
二进制大对象类型:
枚举类型:
集合类型:
时间类型:
(6)设计范式(NF = Normal Format)
1、1NF(第一范式):字段的原子性
2、2NF(第二范式):消除部分(不完全)依赖
3、3NF:消除传递依赖
4、BC范式(BCNF):符合3NF,并且主属性不依赖于主属性。
5、第四范式:要求把同一表内的多对多关系删除。
6、第五范式:从最终结构重新建立原始结构。
(7)实体间的联系:表的记录和记录之间的联系
1对多,多对1:
多对多:
1对1:
(8)外键约束:
(9)select查询语句
1、别名:
2、From子句:
3、Where子句:查询条件,过滤数据。
4、Group by子句:进行分组操作,合并项。
5、Haring子句:与where相似。
6、Order by:排序。
7、Limit子句:限制记录数。
8、选项:
9、表链接:
10、Select语句使用顺序:
11、结果集的操作:
12、汇总数据 :cube
(10)视图(view):
(11)触发器(trigger):
(12)储存引擎:
(13)事务
(14)索引
(15)存储过程:(SQL编程用的,只需了解即可)
MySQL简介
MySQl数据库是关系型数据库。
关系型:使用一个关系来表示实体信息和实体之间的联系。
关系:二维表,有行有列。
SQL:结构化查询语言。
SQL = DDL(数据定义语言)+DML(数据管理语言)+DCL(数据库控制语言)
数据库服务器的结构:
DBS = DBMS + DB
数据库系统 = 数据库管理系统 + 数据库
MySQL实际操作
储存数据: 建立数据库
建立数据表
操作数据(CURD)
CURD = create(建立)+ update(修改)+ read(读)+ delete(删除)
(1)库操作(database)
1、显示库:
Show databases; 显示所有已存在的库
Show databases like ‘条件’; 条件查询
条件查询:
% 匹配0个或多个任意字符串。
_ 可匹配任意一个字符串。
2、查看库资料:
Show create database 库名;
3、创建库:
Create database 库名;
如果建立库时未指定字符集,则使用安装时默认字符集。
四个级别的字符集:服务器级、数据库级、数据表级、字段级(字符串的字段)。
数据库支持多种字符集。
4、容错方式建立库:
create database if not exists 库名;
注释:如果存在该库名,则不能建立,系统发出警报。
5、库名包裹法:
Create database `系统保留字`;
注释:加``(反引号)可强制建立系统保留字的库名。
6、指定字符集:
Create database 库名default charset=字符集;
注释:MySQL默认字符集为utf8,而不是UTF-8。
7、修改数据库:
Alter database 库名 选项;
注释:每建立一个库,生成../mysql/data/库名/库名.opt 的文件,他的内容是保留字符集和校对规则。
8、删除库:
Drop database if exists 库名;
(2)表操作:(table)
1、建立表:
Create table 表名 (字段定义) 选项;
注释:建立表是要指定(进入)库:use 库名;
2、查看表个数:
Show tables; (查看所有表)
3、查看表信息:
Show coumns table 表名\G; (\G:分段显示)
Show index from 表名; 查看表索引
4、查看表结构:
Show columns from 库名.表名;
desc 表名; (以表结构方式显示出来,主要使用方法)
5、改表结构:
Alter table 表名 选项 列字段 列声明;
Modity 改字段属性
Change 同时改字段名
Add 增加字段,默认添加到最后一列。
增加到指定位置:
列声明 first; 添加到第一列
列声明 after 列名; 添加到列名的后一列
增加索引:
例子:alter table 表名 add primary key(字段名);
Add index [unique/index/primary key/fulltext index] 索引名或列名
Drop:
Drop index 索引名或列名;删除非主键索引
Drop primary key; 删除主键索引
6、复制表:
Create table like
7、复制表结构:
Create table 表2 like 表1;
表1-----------复制到------>表2
8、复制表结构同时复制表数据:
Create table 表2 select * from 表1;
表1-----------复制到------>表2
9、改表名:
alter table Rename table 表名1 表名2;
10、交换表名:
alter table
表1to tmp,
表2to 表1,
Tmp to 表2;
11、删除表:
Drop table if exists 表名;
(3)数据操作:(insert into)
1、增加数据:
Insert into 表名 (字段名) values (数据列表);
Insert into 表名 (字段名) values (字段列表1),(字段列表2)....;
Insert into 表名 set 字段1=值1,.........;
数据出现空缺或未指定部分字段,则使用默认值NULL。
不使用默认值 (字段列表 not null)
自定义默认值 (字段列表 not null dfault ‘默认值’)
插入主键:
not nullauto_increment primary key 未指定初始值的自动增量主键
Not null identity(1,1)primary key 指定初始值的自动增量主键
Not null unique primary key 非增量主键
2、使用select从其他表调用数据:
Insert into 表名 select * from 其他表 where ...order by.....limit......;
取代部分对应类型一定要相同。
3、替换数据:
Replace into ......; (和插入相同)
区别:
Insert 直接插入。
Replace 先判断表中的主键或唯一索引字段是否有和插入数据相应的值一样的数据,他就变成修改。 (先删除旧数据再插入新数据)
4、查询数据:
Select * from 表名 ; (查询表中所有数据)
5、查询条件:
Select * from 表名where 条件;
6、修改数据:
Update 表名 set 字段名=新值,....where 条件 order by ....... Limit ....;
注释:不加条件则修改所有,慎重使用。
7、删除数据:
Delete from 表名 where ..... Order by ..... limit .....;
注释:不加条件则删除所有,慎重使用。
列操作为DDL语言不是SQL语言。
(4)字符集和校对规则
字符集:一套符号和字符编码的集合。
校对规则:在字符集内用于比较字符的一套规则。
安装数据库时最好用我们定好的编码。
建立表时可指定字符集:.....charset=[gdk/utf8];
查看编码变量:show varchar like ‘%char%’;
– character_set_server:默认的内部操作字符集
– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前选中数据库的默认字符集
– character_set_system:系统元数据(字段名等)字符集
– 还有以collation_开头的同上面对应的变量,用来描述字符序。
改编码变量:set names 编码;
(5)数据定义类型总汇
整数型:
整数类型 | 字节 | 有符号范围 | 无符号范围 | 用途 |
tinyint | 1 | (-128,127) | (0,255) | 小整数 |
smallint | 2 | (-32 768,32 767) | (0,65 535) | 大整数 |
mediumint | 3 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数 |
int或integer | 4 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 超大整数 |
bigint | 8 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数 |
字段定义方法:
Tinyint(宽度)
Unsigned 无符号整数。
Zerofill 左侧补0,必须为正数。
[null/not null] 是否允许为NULL。
dfault 值 默认值。
Auto_increment 自动增量
Primary key 主键
宽度不代表限制取值范围。
主键:
一般主键为整数,主键是索引的一种。
一个表只能有一个主键,主键可由一列或多列组成(复合主键)。
Primary key = not null + unique
主键存在的方式:
1.唯一主键。如用户ID和学生学号......
2.复合主键。如主机地址+端口号 = 主键。
3.增加一个ID字段作为主键。如ID = (0 , +∞)
浮点数:
浮点数类型 | 字节 | 特点 | 定义(M=有效位数,D=小数位数) |
Float | 4 | 单精度 | Float(M,D) |
Double | 8 | 双精度 | Double(M,D) |
Decimal | [M/D]+2 | 严格浮点数 | Decimal(M,D) |
字符串:
不能插入超过L长度的字符串,L是字符数不是字节数。
定长字符串:设输入数为N,N<=L。
Char(L) L<=255 当N<L时,用空格补齐,实占空间为L。速度快
边长字符串:
Varchar(L) L<=65535(ascii)=22000(utf8) 当N<L时,实占空间为N+(1~2)字节。
大文本类型:
字节根据编码去换算课存多少汉字。
utf8/3=? Gbk/2=?
类型名 | 字节 |
tinytext | 0-255 |
Text | 0-65535 |
mediuntext | 0-224-1 |
longtext | 0-232-1 |
二进制大对象类型:
Blob
保存二进制内容,如 图片、视频、音乐 .......等等。
枚举类型:
Enum (‘值1’,‘值2’,......)
保存单选数据,只能选定义过的数据。
集合类型:
不支持NULL
Set 成员 max 64个
格式:set (‘a’,‘b’,‘c’,......)not null;
时间类型:
类型 | 字节 | 范围 | 格式 | 用途 |
datetime | 4 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
time | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值 |
year | 1 | 1901/2155 | YYYY | 年份值 |
datetime | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 年份时间值 |
timestamp | 4 | 1970-01-01 00:00:00/2037 年某时 | YYYYMMDD HHMMSS | 时间戳
|
(6)设计范式(NF = Normal Format)
范式:规范的格式。
范式是设计关系数据库必须遵守的规则。
如果我们满足了设计范式的要求,则数据库会简洁,结构清晰。
反之,会出现数据冗余,还有插入、删除、修改数据出现异常。
设计范式种类:1NF、2NF、3NF、BCNF(巴德斯科范式)、4NF、5NF(完美范式)。
1NF是最宽松的,依次递增限制越大。
一般数据库只需要满足到3NF就可以了。
1、1NF(第一范式):字段的原子性
要求:数据是二维表,每一列都不能在分割,属性不能再分割,字段保证原子性。
不满足1NF的数据库,则为非关系型数据库。
name | tel | age | |
大宝 | 13612345678 | 22 | |
小明 | 13988776655 | 010-1234567 | 21 |
例子:
name | tel | age | |
手机 | 座机 | ||
大宝 | 13612345678 | 021-9876543 | 22 |
小明 | 13988776655 | 010-1234567 | 21 |
↑以上两个表不满足第一范式。↓下面的表满足了第一范式。
Name | 手机 | 座机 | Age |
大宝 | 13612345678 | 021-9876543 | 22 |
小明 | 13988776655 | 010-1234567 | 21 |
2、2NF(第二范式):消除部分(不完全)依赖
要求:满足1NF的前提下,消除字段对主键的部分依赖,从而完全依赖于主键。
依赖:如果字段A一旦确定,则可以指出B字段的值。
部分(不完全)依赖:依赖其中某个部分的值。
学生 | 课程 | 老师 | 老师职称 | 教材 | 教室 | 上课时间 |
小明 | 一年级语文(上) | 大宝 | 副教授 | 《小学语文1》 | 101 | 14:30 |
小红 | 二年级数学(下) | 张三 | 教授 | 《小学数学2》 | 203 | 16:30 |
↑一个课程,一定指定了某个教材,一年级语文肯定用的是《小学语文1》,那么就有课程->教材。(学生,课程)是个码,课程却决定了教材,这就叫做部分依赖。
↓解决办法,拆分成二个或者若干个表。
学生 | 课程 | 老师 | 老师职称 | 教室 | 上课时间 |
小明 | 一年级语文(上) | 大宝 | 副教授 | 101 | 14:30 |
小红 | 二年级数学(下) | 张三 | 教授 | 203 | 16:30 |
课程 | 教材 |
一年级语文(上) | 《小学语文1》 |
二年级数学(下) | 《小学数学2》 |
3、3NF:消除传递依赖
要求:满足2NF的前提下消除传递依赖。
当表里存在不只一类独立实体,数据也可能存在冗余,在插入、修改、删除、时可能出现混乱的情况。
↓解决办法:拆分成3个表,利用主键建立关系。
学生学号 | 学生姓名 | 学生课程 | 教师 |
109 | 小明 | 001 | 502 |
205 | 小红 | 005 | 109 |
课程ID | 课程名称 | 教材 |
001 | 一年级语文(上) | 《小学语文1》 |
005 | 二年级数学(下) | 《小学数学2》 |
教师ID | 教师姓名 | 教师职称 |
502 | 大宝 | 副教授 |
109 | 张三 | 教授
|
4、BC范式(BCNF):符合3NF,并且主属性不依赖于主属性。
若关系模式属于第一范式,且每个属性都不传递依赖于键码,则R属于BC范式。
通常:BC范式的条件有多种等价的表述:每个非平凡依赖的左边必须包含键码;每个决定因素必须包含键码。
BC范式既检查非主属性,又检查主属性。当只检查非主属性时,就成了第三范式。满足BC范式的关系都必然满足第三范式。
还可以这么说:若一个关系达到了第三范式,并且它只有一个候选码,或者它的每个候选码都是单属性,则该关系自然达到BC范式。
一般,一个数据库设计符合3NF或BCNF就可以了。在BC范式以上还有第四范式、第五范式。
5、第四范式:要求把同一表内的多对多关系删除。
6、第五范式:从最终结构重新建立原始结构。
(7)实体间的联系:表的记录和记录之间的联系
1对多,多对1:
方案:在关系的多端,增加一个字段保存当前实体联系端的实体标识。
多对多:
方案:新增一个关系表,以保证关系的清晰度。
1对1:
方案:把常用信息放在主表中,把不常用的信息放到扩展表中,缩小主表大小,提升主表的查询速度和易读性。
(8)外键约束:
外键:用于建立两个实体间的联系。
外键约束:限制当前表的记录与关联表的记录之间的对应关系。
约束限制:如果主表不存在某信息,则从表不能插入。
设置外键:
1建立表时:
字段名 数据类型 FOREIGN KEY REFERENCES 关联的表名(字段名)
2在存在表中添加或者修改时:
Altertable 表1 add constraint 字段名 foreign key (字段名=表2字段名) references 表2(表2字段名)
(9)select查询语句
格式:
Select选项 字段列表 from、where like、group by、haring、orderby、limit;
字段列表:select* from
Select (字段名) from 表名;
字段部分可参与的运算。
Select 字段±数字 from 表名;
1、别名:
Select 字段名 as 别名 from 表名;
2、From子句:
查询多个表:
select 表1.字段1,表1.字段2...表2.字段1... From 表1,表2;
3、Where子句:查询条件,过滤数据。
当where为假时,不能进行查询。
可进行关系运算符和逻辑运算符。
还可以使用like匹配:
Like ‘%.....%’;
范围提取:
[In/not in/not like]
In (X,Y) 第X行到第Y行。
Between A and B A和B之间的值。
Not between A and B 排除A和B之间的值。
4、Group by子句:进行分组操作,合并项。
Group by 字段1 查看字段1的排序且合并多余。
统计:select id字段,count(*) from 表名 group by id字段;
合并且统计:count(*) * = 每合并一项则+1(*++)
求和:sum(字段名)
求平均值:avg(字段名)
最大最小值:max(字段名)/min(字段名)
连接字段值:id ---> 1,2,3.....
Select group_comat(字段名)from 表名;
5、Haring子句:与where相似。
区别:
where:第一次查询时使用的过滤条件
Haring:针对已过滤并且分组好的数据再次过滤。
不支持字段别名。
6、Order by:排序。
Asc:升序
Desc:降序
默认升序。
7、Limit子句:限制记录数。
Limit start,num
Limit num = limit 0,num
Start:记录开始的索引号
Num:记录数
8、选项:
Distinct 不重复记录
Union 联合查询
把多个查询语句结合在一起。
两个查询语句的字段名不同,则使用第一个语句的。
如果联合里有子句,则分别用括号括起来。
联合时可用distinct选项。
9、表链接:
通过联接,可以从两个或多个表中根据各个表之间的逻辑关系来检索数据。
联接条件可通过以下方式定义两个表在查询中的关联方式:
内联接:[inner] join
仅当两个表中都至少有一个行符合联接条件时,内部联接才返回行,内部联接消除了与另一个表中的行不匹配的行.
外连接 [LEFT |RIGHT|FULL] outer join
外部联接会返回from子句中提到的至少一个表或视图中的所有行,只要这些行符合任何where或haring搜索条件。将检索通过左外部联接引用的左表中的所有行,以及通过右外部联接引用的右表中的所有行。在完全外部联接中,将返回两个表的所有行
其分为:
左外部联接,数据列表包括了满足查询条件的左边表的所有行。
右外部联接,数据列表包括了满足查询条件的右边表的所有行。
完全外部联接,数据包含了所有满足查询条件的行。
交叉联接:cross join
返回满足查询条件记录的笛卡尔积运算的集合(N×M)。
自联接:表可以通过自联接与自身联接。
NULL和联接:
联接表的列中的空值(如果有)互相不匹配。如果其中一个联接表的列中出现空值,只能通过外部联接返回这些空值(除非 WHERE 子句不包括空值)。
10、Select语句使用顺序:
Where-->group by -->haring -->order by-->limit
11、结果集的操作:
[all]union 运算符组合结果集:
union 运算符使您得以将两个或多个select语句的结果组合成一个结果集。使用uninon运算符组合的结果集都必须具有相同的结构。而且它们的列数必须相同,并且相应的结果集列的数据类型必须兼容。
默认情况下,union运算符将从结果集中删除重复的行。如果使用 ALL 关键字,那么结果中将包含所有行而不删除重复的行。
except和intersect执行半联接操作 :
except和intersect运算符使您可以比较两个或多个select语句的结果并返回非重复值。except运算符返回由except运算符左侧的查询返回、而又不包含在右侧查询所返回的值中的所有非重复值。
intersect返回由intersect运算符左侧和右侧的查询都返回的所有非重复值。使用except或intersect比较的结果集必须具有相同的结构。
公用表表达式(cte)递归查询
公用表表达式(cte)具有一个重要的优点,那就是能够引用其自身,从而创建递归cte。递归cte是一个重复执行初始cte以返回数据子集直到获取完整结果集的公用表表达式。
递归cte由下列三个元素组成:
- 例程的调用:递归 CTE 的第一个调用包括一个或多个由 union all、union、except 或 intersect 运算符联接的 cte_query_definitions。由于这些查询定义形成了cte 结构的基准结果集,所以它们被称为“定位点成员”。
- 例程的递归调用。递归调用包括一个或多个由引用 cte 本身的 union all 运算符联接的cte_query_definitions。这些查询定义被称为“递归成员”。
- 终止检查。 终止检查是隐式的;当上一个调用中未返回行时,递归将停止。
12、汇总数据 :cube
cube汇总数据:
cube运算符生成的结果集是多维数据集。多维数据集是事实数据的扩展。扩展是基于用户要分析的列建立的。这些列称为维度
如:根据区域(areaid)汇总各商品(productid)的销售情况
selectareaid,productid,sum(total) from cw_orderdetail whereostate=1 group by areaid ,productid with cube
rollup汇总数据。
rollup 运算符生成的结果集类似于 cube 运算符生成的结果集。cube 生成的结果集显示了所选列中值的所有组合的聚合;rollup 生成的结果集显示了所选列中值的某一层次结构的聚合。
compute和compute by汇总数据:
computeby子句使您得以用同一select语句既查看明细行,又查看汇总行。可以计算子组的汇总值,也可以计算整个结果集的汇总值。
for子句:
for子句用来指定browse或xml选项
selectid,name from content for xml auto,xmldata --
(10)视图(view):
1、定义:视图是由查询结果形成的一张虚拟表,没有真实数据存在。
2、创建语法:create view 视图名 as select 语句;
3、删除语法:(建议删除重建)
4、意义:
- 简化查询
- 可以进行权限控制。 (封闭表权限,开放部分数据)
- 大数据分表可以使用。
5、视图和表的关系:
- 视图是表的查询结果。
- 表改变,视图也变。
- 视图改变,表可能改变。
- 视图的数据与表的数据一一对应时,会互相改变。
6、视图的algorithm(算法):
Algorithm = [merge/temptable/undefined]
Merge:将引用视图的语句的文本与视图定义合并,使得视图定义的某一部分取代语句的对应部分。
Temptable:视图的结果将被置于临时表中,然后使用它执行语句。
Undefined:系统默认,倾向于merge而不是temptable。
(11)触发器(trigger):
1、作用:监视某种情况并触发某种操作。
触发器能监视表的增、删、改,进行增、删、改操作。
2、创建触发器语法:(需要提前修改结束符:delimiter 结束符)
create trigger trigger_name
after/before
增、删、改on 表名
For each rom
Begin SQL语句;
End结束符
触发器名称
触发器时间
After和before的区别:
After:先完成数据操作,在触发。
Before:先于监视的操作,在触发数据的操作
触发器监视的事件
触发器监视地点
触发器触发的事件
3、触发器引用行的值:
1.对于inset而言,新增加行用new表示。
行中每一行的值用new.列名
2.对于delete而言,原本有一行,后来删除了,想引用被删除行,用old.列名
3.对于update而言,被修改行 修改前,用old.列名
修改后,用new.列名
4、删除触发器:
Drop trigger 触发器名称
(12)储存引擎:
1、概念:数据库对同样的数据,有着不同的储存方式和管理方式。
2、MyISAM:
1.MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表明。
2.MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。
3.MyISAM存储引擎特别适合在以下几种情况下使用:
3.1选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。
3.2插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。
3、InnoDB:
1.InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作非常大的数据存储提供了一个强大的解决方案。InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择:
2.更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。
3.事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
4.自动灾难恢复。
5.外键约束。
6.支持自动增加列AUTO_INCREMENT属性。
一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。
(13)事务
1、事务:(仅InnoDB支持)
一组操作,要么都执行,要么都不执行。 原子性
事务没有执行完毕前,会话不可见其过程。 隔离性
事务发生前和发生后,数据的总额依然匹配。 一致性
事务产生的影响不能撤销。 持久性
事务出现错误不允许撤销,只能用事务‘补偿’。
2、使用事务:
Start transaction;
SQL1,
SQL2,
SQL3,
.........
[Commit(提交)/rollback(撤销)]
注意:有一些语句会造成事务隐藏式提交。
3、事务回滚:
1.关闭事务自动提交:
Set autocommit=0;
2.创建还原点:
Savepoint 还原点名称;
3.回到(回滚)到指定还原点:
Rollback to 还原点名称;
4.回滚到最初原始点:
Rollback;
(14)索引
1、索引:针对数据所建立的目录。
Btree索引次数:Log2N
hash索引次数:1
2、使用原则:
1.不过度索引。
2.索引条件列(where后面频繁条件适合索引)。
3.索引散列值,过于集中的值不要加索引。
3、索引:
普通索引:index 仅仅加快查询速度。
唯一索引:unique index 行上值不能重复,唯一不一定主键。
主键索引:primary key 不能重复,必定唯一。
4、查看表索引:
Show index from 表名;
5、建立索引:
Alter table 表名 add [index/unique index/primary key] 列名;
6、删除索引:
删除非主键索引:
Alter table 表名 drop index 索引名;
删除主键索引:
Alter table 表名 drop primary key;
7、全文索引用法:
Select * from 表名where match (intro) against (‘索引词’);
8、停止词:全文索引不针对非常频繁的词做索引。
如:this、is、you、my......等等
9、全文索引:在MySQL默认情况下、对中文意义不大。
10、查看select是否利用了索引:
Explain SQL语句 \G
EXPLAIN列的解释:
table:显示这一行的数据是关于哪张表的
type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、 indexhe和ALL
possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引
key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
rows:MYSQL认为必须检查的用来返回请求数据的行数
Extra:关于MYSQL如何解析查询的额外信息。坏的例子是Using temporary和Usingfilesort,意思MYSQL根本不能使用索引,结果是检索会很慢
Extra列返回的描述的意义:
Distinct:一旦MYSQL找到了与行相联合匹配的行,就不再搜索了
Not exists: MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了
Range checked foreach Record(index map:#):没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一
Using filesort: 看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行
Using index: 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候
Using temporary 看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上
Where used 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)
system 表只有一行:system表。这是const连接类型的特殊情况
const:表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待
eq_ref:在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用
ref:这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好
range:这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况
index: 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)
ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免.
11、查询匹配度:
Select match(字段) against(‘索引词’) from 表名;
12、全文索引的正确使用方法:
select * from 表名where match(字段名) against(‘索引词’);
13、分词:
1.全文索引应用流程:
1.接收数据-数据分词-入库
2.接收数据-数据分词-查询
2.怎么对数据分词?
数据分词一般我们会使用一些成熟免费的分词系统,当然如果你有能力也可以自己做分词系统,这里我们推荐使用SCWS分词插件。
3.首先下载
1.php_scws.dll 注意对应版本
2.XDB词典文件
3.规则集文件
下载地址:http://www.xunsearch.com/scws/download.php
4.安装scws
1.先建一个文件夹,位置不限,但是最好不要中文路径。
2.解压{规则集文件},把xdb、三个INI文件全部扔到 D:\scws
3.把php_scws.dll复制到你的PHP目录下的EXT文件夹里面
4.在php.ini 的末尾加入以下几行:
5.[scws]
注意请检查 php.ini 中的 extension_dir 的设定值是否正确, 否则请将 extension_dir 设为空,
再把php_scws.dll 指定为绝对路径。
extension = php_scws.dll
scws.default.charset = utf8
scws.default.fpath ="D:\scws"
6.重启你的服务器
7.测试复制代码
代码如下:
$str="测试中文分词";
$so = scws_new();
$so->send_text($str);
$temp=$so->get_result();
$so->close();
var_dump($temp);
(15)存储过程:(SQL编程用的,只需了解即可)
1、存储过程:
类似于函数,就是把一段代码封装起来。当要执行这一段代码时,可通过调用该存储过程来实现。在封装时的语句体里,可用if/else、case、while等,控制结构,可以进行SQL编程。
2、查看存储过程:
Show procedure status;
3、删除:
Drop procedure 过程名;
4、调用:
Call 过程名();
5、在MySQL中,存储过程和函数的区别:
1.名称不同。
2.存储过程没有返回值。