一、数据的导入导出
导出整个数据库
Mysqldump -u用户名 -p密码 --default-character-set=utf-8 数据库名>导出的文件名
导出一张表
Mysqldump -u用户名 -p密码 数据库名 表名>导出的文件名
导出一张表结构
二、表操作
建表
Createtable<表名>(<字段名1><类型1>[,..<字段名n><类型n>]);
获取表结构
Desc <表名>
Showcolumns from <表名>
showcreate table <表名>
插入数据
Insert into<表名>[(<字段名1>,[,..<字段名n>])] values (值1)[,值n]
查询语句
select[select选项]字段列表/*from 数据源[where条件字句][group by字句][having 字句][order by 字句][limit 子句]
更新语句
Update table_name set field1=new_value1 [,..fieldn=new_valuen] where [clause]
删除语句
Delete from table_name [where clause]
Like子句(在linux中*表示任意字符,在windows中%表示任意字符)
Select field1 [,..fieldn] from table_name where field1 like condition1
[and[or]]field2=’somevalue’
Union子句
Select exp1 [,..expn] from table1 [where conditions] union [all| distinct] select exp1[,..expn] from table2 [where conditions]
排序
Select field1 [,..fieldn] from table_name [where clause] [order by field1[,..fieldn]] [asc desc]
分组
Select field1 [,..fieldn] from table_name [where clause] group by column_name
Join语句
Select a.field1,b.field1[,..] from table1 [inner]|left|right join table2 b on a.field1=b.field1
NULL值处理
ISNULL:当列的值为NULL,返回true
IS NOT NULL:当列值不为NULL,返回true
<=>:当比较的两个值为NULL时返回true
正则表达式
Select field1 [,..fieldn] from table_name where field1 regexp ’somevalue’
alter命令
alter table table_name [drop|add|modify] column_name [datatype];
alter table table_name alter column_name set default **;
alter table table_name alter column_name drop default;
alter table table_name1 rename to table_name2;
alter table table_name drop foreign key keyName;
使用alter命令添加和删除索引
1.添加一个主键
alter table table_name add primary key(column_name)
2.创建的索引值必须是唯一的
alter table_table name add unique index_name(column_name)
3.添加普通索引,索引值可能出现多次
alter table table_name add index index_name(column_name)
4.添加全文索引
alter table table_name add fulltext index_name(column_name)
临时表
使用show tables命令不能显示该表,退出当前会话,临时表会被销毁
create temporary table table_name ();
元数据
命令
描述
select version()
服务器版本信息
select database()
当前数据库名
select user()
当前用户名
show status
服务器状态
show variables
服务器配置
重复数据
统计重复数据:
select count(*) as repetions,last_name,first_name from person_tbl group by last_name,first_name having repetitions>1
过滤重复数据
select distinct last_name,first_name from person_tbl;
删除重复数据
alter ignore table person_tbl add primary key(last_name,first_name)
数据类型
枚举
插入的数据只能在枚举值中,否则报错。可以规范数据结构、节省空间。但不够高效。
createtable gender_enum (gender enum(’男’,’女’,’保密’));
枚举在数据定义的时候,系统会自动建立一个数字于枚举元素的对应关系(放在日志中),然后在进行数据插入的时候,系统自动将字符转换成对应的数字存储,在数据提取的时候,系统将数值转换为相应的字符串显示。
集合字符串
集合和枚举类似,实际存储的数值,而不是字符串.每一个元素都是对应的二进制位。
定义:set(元素列表)
使用,可以使用多个元素,用逗号隔开
create table my_set(hobby set (’篮球’,’足球’,’羽毛球’,’排球’));
insert into my_set values(’篮球,羽毛球,乒乓球’);
Msql记录长度
mysql中规定:任何一条记录最长不能超过65535(varchar永远不能达到理论值)
utf8下:varchar最多存储21844个字符( 其中size属性要占两个字节)21844*3+2
GBK下:varchar最多32766个字符32766*2+1
mysql记录中如果有任何一个字段可以为空空,那么系统会自动从整个记录中保留一个字节来存储NULL,如果想要释放NULL所占用的字节,那么必须保证所有的字段都不允许为空。
mysql中text文本字符串,不占用记录长度,但是text文本字符串,也是属于记录的一部分,占用记录中10个字节长度来保存数据的地址和长度。
字符串,数字和日期之间的相互转换
字符串转日期str_to_date(‘2015-10-11’,’%Y-%m-%d’)
日期转字符串date_format(now(),’%Y-%m-%d%H:%i:%s’);
字符串转数字:cast(’123’as unsigned),convert(’123’,unsigned),
select’123’+0;
4.数字转字符串:cast(2 as char(12)),convert(2,char(12));
外键
在实际开发中,外键降低了对数据的可控性,所以通常不使用外键约束。
创建表时,外键要求字段本身必须先是一个索引,如果字段本身没有索引,外键会先创建一个索引,才会创建外键本身。一张表可以有多个外键,但外键名不能相同
create table([constraint 外键名]foreignkey(外键字段)references 外部表(主键字段))
新增表后
alter table 表名add[constraint 外键名]foreign key(外键字段)references 父表(主键字段)
删除外键
alter table 表名drop foreign key 外键名.
外键作用:
子表约束:(增和改)子表数据进行写操作的时候,如果对应的外键字段在父表中找不到对应的匹配,那么操作会失败。
父表操作:(删和改,和主键相关)如果对应的主键在子表中已经被数据所引用,就不允许操作。
修改外键约束:三种约束模式(针对父表约束):
district:父表不能删除或者更新一个已经被子表数据引用的记录。
cascade:级联模式,父表的操作,对应子表关联的数据也跟着操作。
set null:制空模式,父表操作之后,子表对应的数据(外键字段)被置空。
合理的约束模式:删除的时候子表置空(外键字段允许为空),更新的时候子表级联操作。
foreign key(外键字段)references 子表(主键字段)on delete set null on update cascade
外键条件
表的存储引擎是innodb。如不是,那么外键可以创建成功,但是没有约束效果。
外键字段的字段类型比如与父表的主键类型完全一致。
外键名不能重复
增加外键字段,必须保证数据与父表主键要求对应。
范式(NormalFormat)
保证保存数据的存储之后,凡是能够通过关系寻找出来的数据,坚决不重复存储,终极目标是减少数据的冗余。
范式是一种分层结构的规划,分为6层,每一层都比上一层更加严格,如要满足下一次范式,前提是满足上一次范式。(1NF,2NF,...,6NF),1NF最低,6NF最高。
1NF
第一范式:在设计表存储数据的时候,如果表中设计的字段存储的数据,在取出来使用之前还需要额外处理,那么表的设计不满足第一范式。第一范式要求字段的数据具有原子性。
2NF
第二范式:在数据表设计的过程中,如果有复合主键(多字段主键),且表中有字段并不是由整个主键来确定,而是依赖主键中的某个字段,存在字段依赖主键的部分问题,称之为部分依赖,第二范式就是要解决表设计不允许出现部分依赖。
只有复合朱建中才有可能出现的问题。
讲师P | 班级P | 开始 | 结束 | 教室 | 性别 |
朱元璋 | php0320 | ||||
朱元璋 | php0326 | ||||
李世民 | php0320 |
以上表中,因为讲师没有办法作为独立主键,需要结合班级才能作为主键。开始和结束都与当前的代课主键,但是性别不依赖班级,教室不依赖讲师。性别只依赖讲师,教室只依赖班级,出现了性别和教室依赖主键中的一部分,不符合第二范式。
解决方案:1.可以将性别与讲师单独程表,班级与教室单独成表。
2.取消复合主键。使用逻辑主键。
pID | 讲师 | 班级 | 开始 | 结束 | 教室 | 性别 |
1 | 朱元璋 | php0320 | ||||
2 | 朱元璋 | php0326 | ||||
3 | 李世民 | php0320 |
3NF
理论上讲,应该一张表中的所有字段都直接依赖主键,如果表设计中存在一个字段,并不直接依赖主键,而是通过某个非主键字段依赖,最终实现依赖主键,把这种不是直接依赖主键,而是依赖非主键字段的依赖关系称之为传递依赖。第三范式解决传递依赖问题。
在上表中,性别和教室都存在传递依赖。
解决方案,将存在传递依赖的字段,以及依赖的字段本身单独取出来,形成一个单独的表,然后在需要对应的信息时候,使用对应的实体表的主键加进来
ID | 讲师 | 性别 |
| ||
ID | 班级 | 教室 |
|
逆规范式
有时候在设计表的时候,如果一张表中有几个字段是需要从另外的表中去获取信息,理论上讲,的确可以获取到想要的数据,但是效率低一点,会可以的在某些表中,不去保存另外表的主键,而是直接保存想要的数据信息,这样一来,在查询数据的时候,一张表可以直接提供数据,而不需要多表查询。这样会导致数据冗余增加。
主键冲突
(更新)insert into 表名 values(值列表) on duplicate key update 列名=值
(替换)replace insert into 表名values(值列表)
蠕虫复制
从已有的数据中去获取数据,然后将数据又进行新增操作,数据成倍的增加。
insert into 表名select字段列表/*from 数据表名;
可以从已有表拷贝数据到新表,可以迅速的让表中的数据膨胀到一定数量级,测试表的压力和效率。
高级更新数据
update 表名 set 字段名=值 [where条件][limit数量]//limit限制更新数量
高级删除
delete from 表名[where条件][limit 数量]
truncate 表名//清空自增长
select语句
select [select选项]字段列表/*from 数据源 [where条件字句][group by字句][having 字句][order by 字句][limit 子句]
[select选项]:all[默认],distinct[去重]
[where子句]:读取磁盘中的数据,不可以使用别名。
[haveing子句]:读取内存中的数据,几乎可以干where的所有工作,主要用于统计,可以使用别名。
[group by 子句]将数据进行分组,显示第一条记录
[order by子句]:排序数据,显示所有数据,可以多重排序,各字段用逗号隔开。
[limit子句]:1.限制数据的长度(limit数量),2.限制起始位置,数量(limit起始位置[从0开始计数],长度)
连接查询
分类:内链接:inner join,从左表中取出每一条记录,去右表中与所有记录进行匹配,匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留。
外连接:outer join,以某张表为主,取出里面的所有记录,每条与另外一张进行连接,不管能不能匹配上条件,最终都会保留,能匹配,正确保留,不能匹配,其他字段都为NULL
左外连接:left join以左表为主表
右外连接:right join以右表为主表
交叉连接:cross join,从一张表中循环取出一条记录,每条记录都去另外一张表匹配,匹配一定保留(没有条件匹配),而连接本身字段就是增加,最终形成的结果叫做笛卡尔积。
联合查询
将多次查询,在记录上进行拼接。
作用:查询同一张表,但是需求不一样。
多表查询,多张表的结构一样,保存的数据(结构)也是一样。
基本语法
多条select语句构成,每一条select语句获取的字段数必须严格一致,以用来生成二维表,但字段类型无关。
select语句1 union [union选项] select 语句2...
[union选项] :与select选项一样,默认是distinct
在联合查询中,orde rby不能直接使用,需要使用括号,若要order by生效,必须使用limit.
(select* from my_student where sex=’男’orderby age asc limit 999999)
union
(select* from my_student where sex=’女’orderby age desc limit 999999)
子查询
查询是在某一个查询结果之上进行的(一条select语句包含了另外一条select语句)
分类:按位置分:子查询在外部查询中出现的位置:
from子查询:子查询跟在from之后
where子查询:子查询跟在where之后
exits子查询:子查询跟在exits之后
按结果分:根据子查询得到的数据进行分类
标量子查询:子查询得到的结果是一行一列
列子查询:子查询得到的结果是一行多列
行子查询:子查询得到的结果是多行一列
上面三个子查询出现的位置都是在where之后
表子查询:子查询得到的结果是多行多列(出现的位置在from之后)
标量子查询
需求:查询班级名字为php0710的所有学生信息
确定数据源:获取所有学生
select* from my_student where id=?
获取学生ID,可以通过班级名字确定
select id from my_classwhere c_name=’php0710’;
3.将两条查询语句合并
select * from my_studentwhere id=
(select id from my_classwhere c_name=’php0710’);
列子查询
列子查询使用in作为添加匹配,其他关键字有all,some,any
=any==in其中一个即可
any====some
=all=====全部
需求:查询所有在读班级的学生(班级表存在的班级)
确定数据源,学生
select* from my_student where c_id in(?);
确定有效班级id,所有班级id
selectid from my_class
合并查询语句
select* from my_student where c_id in
(selectid from my_class)
select* from my_student where c_id
=any(selectid from my_class)
行子查询
返回可以是多行多列(一行多列),需要构建行元素(age,height)。
需求:要求查询所有学生中,年龄最大且身高最高的学生
确定数据源
select* from my_student where age=? and height=?
确定最大的年龄和最高的身高
selectmax(age),max(height)from my_student
3.合并数据
select* from my_student where (age,height) =
(selectmax(age),max(height) from my_student)
表子查询
子查询返回的结果当作二维表来使用
需求:找出每个班中最高的一个学生
确定数据源:先将学生进行降序排序
select *from my_student order by height desc
从每个班选出第一个学生
select *from my_student group by c_id;
合并数据
select* from
(select* from my_student order by height desc)as student
groupby c_id
Exists子查询
判断某些条件是否满足,exists在where之后,exists返回1和0.
需求:查询所有班级存在的学生
确定数据源
select* from my_student where ?;
确定天骄是否满足
select* from my_class --是否存在
合并查询语句
select* from my_student where
exists(select* from my_class);
中文数据问题
查看服务器支持的编码:showcharacter set;
查看当前编码:showcharacter like '%character_set%’
character_set_client:服务器默认的客户端来的数据的字符集
character_set_connection:连接层字符集
character_set_database:当前数据库的字符集
character_set_results:服务器默认的给外部数据的字符集
改变字符集:setcharacter_set_client =utf8;//修改的只是会话界别(当前客户端连接有效,关闭失效。
可以设置set namesgbk;(包含client,results,connection)
web乱码问题
校对集
数据比较的方式,有三种方式:
_bin:binary,二进制比较,取出二进制位,区分大小写。
_cs:casesensitive,大小写敏感,区分大小写。
_ci:caseinsensitive:不区分大小写。
查看数据库支持的校对集:showcollation;
校对集:只有当数据产生比较时,校对集才会生效
create table (...) charset utf8 collate utf8_bin
校对集必须在没有数据之前生命好,如果有了数据,那个对校对集的修改是无效的。
视图
有结构(有行有列)但是没有结果(结构中不真实存放数据)的虚拟表。其结构来源不是自己定义,而是从对应的基表中产生。
创建视图
create view 示图名as select 语句
视图基表有多张的情况下注意字段名不能重复。
查看视图
同表的查看命令相同:show tables [like]/desc
视图一旦创建,系统会在视图对应的数据库文件夹下创建一个对应的结构文件:frm文件
使用视图
使用视图主要是为了查询,将视图当作表一样查询即可。视图的执行本质是执行封装的select语句。
select* from 视图名
修改视图
视图本身不可以修改,但可以修改视图的来源,即select语句。
alterview 视图名 as 新的select语句
删除视图
drop view 视图名
视图意义
1.视图可以节省sql语句,将一条复杂的sql语句进行保存,以后直接对视图进行操纵。
2.对视图结构进行处理,不会影响基表数据。
3.视图往往在大项目中使用,而且是多系统中使用。对外提供有用数据,隐藏无用数据。
4.不同的视图提供不同的数据
5.视图可以更好的进行权限控制
视图数据操作
视图进行数据写操作,有很多限制。对视图的操作成功,会该表基表的数据
新增数据
注:多表视图不能新增数据。可以向单表视图插入数据,但是视图中所包含的字段必须有基表中所有不能为空(或者没有默认值)字段。
删除数据
多表视图不能删除数据。
更新数据
更新限制:如果在视图在新增的时候限定了某个字段有限制,那么对视图进行数据跟新操作时,系统会进行验证,保证更新之后数据依然可以被实体查询出来,否则则不让更新。对于视图本身不能查询的数据,修改某个字段仍然不能被视图查询到,且不会修改基表中的数据。
createview my_v3 as select * from my_student where age>30 with checkoption; ---with checkoption:决定通过视图更新的时候,不能将age>30的数据改为age<30,如果将年龄小于30的数据改为年龄大于30,基表中和视图中的数据不会改变。;
视图算法
系统对视图已经外部查询视图的select语句的一种解析方式。
视图算法分为两种:
temptable:临时表算法:系统应该先执行视图的select语句,后执行外部查询语句
merge:系统应该将视图对应的select语句与外部查询视图的select语句进行合并然后执行(效率高,系统默认算法)
算法指定:在创建视图时
createalgorithm=指定算法view视图名asselect 语句
视图算法选择:如果视图的select语句中会包含一个查询语句(五子句),而且很有可能顺序比外部的查询语句要靠后,一定要使用算法temtable,其他情况可以不用指定。
数据的备份和还原
方式:数据表备份、单表数据备份、SQL备份、增量备份
数据表备份
不需要通过SQL备份,直接进入到数据文件夹复制对应的表结构和数据文件,以后还原的时候直接将备份的内容放进去即可。
根据不同的存储引擎不同有区别
mysql的存储引擎有innodb和myisam.
文件备份方式通常适用于myisam,直接复制文件即可
单表数据备份
每次只能备份一张表,只能备份数据。将表中的数据导出到文件。
备份:从表中选出一部分数据保存到外部文件中。
select*/字段列表intooutfile 文件所在路径from数据源 ;//前提是外部文件不存在,注意这里可能会出现--secure-file-priv错误,需要在my.ini中的[mysqld]区块下添加secure_file_priv=
可以指定字段的包裹符号和分割字段以及行的分割
SELECTa,b,a+b INTO OUTFILE '/tmp/result.txt'
FIELDS
TERMINATED BY ',' ---指定字段的分割符a,b
ENCLOSEDBY '"' ---指定字段的包裹符”a”,”b”
LINES
TERMINATEDBY '\n'-- 每行以什么结束,默认\r\n
FROMtest_table;
还原:将一个外部保存的数据重新恢复到表中(如果表结构不存在,不能还原)
loaddata infile 文件所在路径intotable 表名 [(字段列表)]fields 字段处理lines 行处理
SQL备份
备份:系统对表结构及数据进行处理,变成对应的SQL语句。需要利用mysql提供的软件mysqldump.exe.mysqldump也是客户端,需要认证。
mysqldump-u用户名 -p 数据库名[数据表名1,数据表名2]> 文件名
还原:执行SQL语句即可。
1.使用mysql客户端
mysql-u用户名 -p数据库名 <文件名
使用sql指令还原(需要先指定数据库)
source文件名 --sourced:/1.sql
增量备份
不是针对数据或者sql指令进行备份,而是针对mysql服务器的日志文件进行备份,备份的数据不会重复,而且所有的操作都会被备份。大项目一般都选择增量备份.
在使用增量备份时,需要打开mysql的binarylog.具体方法为在[mysqld]区块中添加log-bin=base_name.对于5.7.3及以后的版本需要设置server-id否则无法开启服务。
显示备份文件列表:show binary logs;
显示当前使用的备份文件:show master status;
查看日志
mysqlbinlog 日志名
清空所有的日志
reset master
将日志导入文件
mysqlbinlog binlog.000001 > d:/1.sql添加到文件
mysqlbinlog binlog.000002 >> d:/1.sql附加到文件结尾
基于时间还原
需要在msqlbinlog命令中指定--start-datetime和--stop-datetime。
mysqlbinlog--stop-datetime="2005-04-20 9:59:59" \
/var/log/mysql/bin.123456| mysql -u root -p
mysqlbinlog--stop-datetime="2005-04-20 9:59:59" \
/var/log/mysql/bin.123456| mysql -u root -p
基于位置还原
需要在mysqlbinlog指令中指定--start-positoin和--stop-position
mysqlbinlog--start-datetime="2005-04-20 9:55:00" \
--stop-datetime="2005-04-2010:05:00" \
/var/log/mysql/bin.123456> /tmp/mysql_restore.sql
将日志写入文件,然后在sql文件中查找想要还原的操作,位置信息被log_pos标记
mysqlbinlog--stop-position=368312 /var/log/mysql/bin.123456 \
|mysql -u root -p
mysqlbinlog--start-position=368315 /var/log/mysql/bin.123456 \
|mysql -u root -p
触发器
触发器trigger:事先为某张表绑定一段代码,当表中的某些内容发生改变的时候(增删改),系统会自动触发代码执行。
触发器包括:事件类型,触发时间,触发对象
事件类型:增删改,三种类型
触发时间:前后before和after
触发对象:表中的每一条记录(行)
一张表只能拥有一种触发时间的一种类型的触发器,即最多可以有6种触发器。
事务
操作方式:自动事务(默认),手动事物
手动事务操作流程:1.开启事物(starttransaction)
2.进行事物操作
3.提交事物(committransaction)
事务回滚(rollback)
创建触发器:
1.在mysql高级结构中,没有大括号,都是用对应的字符符号代替。
Delimiter--自定义符号:后续代码中只有碰到自定义符号才算结束
createtrigger 触发器名字触发时间 事件类型on表名foreach row
begin --左大括号
--里面是触发器的内容,每行内容都必须使用语句结束符分号(;)
end --右大括号
delimiter; --改回结束符
暴力报错
2.查看所有触发器
showtriggers;
3.查看触发器创建语句
showcreate trigger 触发器名
所有触发器都会保存到information_schema.triggers
select* from information_schema.triggers
使用触发器
修改触发器&删除触发器
触发器不能修改,只能先删除,后新增
droptrigger 触发器名
触发器记录
不管触发器是否触发,只要当某种操作被执行,系统就会将当前要操作的记录的当前状态和即将执行之后的新的状态给分别保存下来。其中,要操作的当前状态保存在old中,新的状态在new中。new代表假设发生的结果
old代表旧记录,new代表新纪录:删除的时候没有new,插入时没有old。
使用方式:old.字段名/new.字段名
代码执行结构
在mysql中只有if分支
基本语法
if条件判断 then
--满足条件要执行的代码;
else
--不满足条件要执行的代码;
endif;
2.循环结构:
while循环(没有for循环)
基本语法
[循环名:]while条件循环 do
--满足条件要执行的代码
--变更循环条件
endwhile;
3.循环控制
mysql中没有对应的continue和break。
iterate:迭代,类似continue,后面的代码不执行
leave:类似break,整个循环结束
函数
将一段代码块封装到一个结构中,在需要执行代码块的时候,调用结构执行
函数分为:系统函数和自定义函数
1.系统函数
可以直接调用,任何函数都有返回值,因此函数的调用是通过select调用。
mysql中,字符串的基本操作单位是字符
subString:字符串截取,从位置1开始(字符为单位)
char_length:字符长度
length:字节长度
instr:判断字符串是否在某个具体的字符串中(src,newstr),返回第一次查找的位置
lpad:左填充,将字符串按照某个指定的填充方式填充指定长度
insert:找到目标位置指定长度的字符串,替换目标字符串。
strcmp:字符串比较,小于返回-1,相等返回0,大于返回1.不区分大小写。
cast:将一个值转换为指定的数据类型(binary,char,date,time,datetime,signed,unsigned,)
2.自定义函数
创建函数:函数属于某一个数据库
createfunction 函数名(形参列表)returns 数据类型--规定要返回的类型
begin
--函数体
--返回值:return类型(指定数据类型)
end
3查看函数
3.1查看所有函数
showfunction status [like 'pattern’];
3.2查看函数的创建:
showcreate function 函数名;
4函数删除
dropfunction 函数名;
5函数参数
形参要求必须指定形参类型
function函数名(形参名类型[,形参名类型])
在函数内部使用的@定义的变量是全局变量,在函数外部也可以访问。
6函数作用域
mysql中的作用域于js中的js作用域完全一样,全局变量可以在任何地方使用,局部变量只能在函数内部使用。
全局变量:使用set关键字定义,使用@符号标识
局部变量:使用declare关键字声明,没有@符号,必须在函数体开始之前。
存储过程
procedure。定义:是一种用来出来数据的方式,是一种没有返回值的函数。
创建过程
createprocedure 过程名字[参数列表]
begin
--过程体
end
查看过程
查看所有过程:
showprocedure status [like 'pattern’]
查看过程创建语句
showcreate procedure 过程名
调用过程
过程没有返回值,不能使用select。它有一个专门的调用字call
call过程名;
删除过程
dropprocedure 过程名
索引
系统根据算法,将已有的数据(未来可能新增的数据)单独建立一个文件,能够快速匹配数据,并且能够快速找到对应表中的记录。所有的字段都是建立在索引上的。索引能提升查询数据的效率。
使用索引的原则:
越小的数据类型通常更好。
简单的数据类型更好。
尽量避免NULL。
整形通常是作为标识符最好的选择,尽量避免使用字符串作为标识符。
如果对多列进行索引,mysql仅能对索引最左边的前缀进行有效的查找。
索引本身会产生索引文件,会非常耗费磁盘空间。如果某个字段需要作为查询的条件经常使用,那么可以使用索引。如果某个字段需要进行数据的有效性约束,也可以使用索引。
mysql中提供的索引:
主键索引(primarykey),
唯一索引(uniquekey),
全文索引(fulltextindex):针对文章内部关键字进行索引。问题在于怎么确定关键字。英文很容易,单词和单词有空格。中文很难,没有空格,而且可以随意组合(分词:sphinx).
普通索引(index)
查看索引
showindex from tablename;
showkeys from tablename;
删除索引
altertable talename drop index index_name;
altertable table_name drop primary key;
dropindex index_name on table_name;
新建索引
altertable table_name add index index_name(column_list);
altertable table_name add unique(column_list);
altertable table_name add primary key(column_list);