createtable tea3( id intprimary key auto_increment, name varchar(20), age int, unique index_name(name) ); createunique index index_name on tea3(name); altertable tea3 addunique index_name(name);
createtable tea4( id intprimary key auto_increment, name varchar(20), age int );
1 2 3 4 5 6
createtable tea4( id int, name varchar(20), age int ); altertable tea4 addprimary key(id);
组合索引
1 2 3 4 5 6 7 8
createtable tea5( id int, name varchar(20), age int, index index_name(id,name) ); create index index_name on tea5(id,name); altertable tea5 add index index_name(id,name);
注意事项:复合索引的使用复合最左原则 table_name(id, name)
where id=1可以使用索引,条件里面必须包含索引前面的字段才能够继续进行匹配
where name=’lisi’ 不可以使用索引
where name=’lisi’ and id=12可以使用索引,mysql本身就有一层sql优化,他会根据sql来识别出来该用哪个索引
where id=12 and name=’lisi’ 可以使用,顺序一致
全文索引
为什么要全文索引?
like + % 在文本比较少时是合适的,但是对于大量的文本数据检索,是不可 想象的。
全文索引在大量的数据面前,能比 like + % 快 N 倍,速度不是一个数量级, 但是全文索引可能存在精度问题。
索引变量(了解即可)
MySQL 中的全文索引,有两个变量,最小搜索长度和最大搜索长度,对于长度 小于最小搜索长度和大于最大搜索长度的词语,都不会被索引。通俗点就是说, 想对一个词语使用全文索引搜索,那么这个词语的长度必须在以上两个变量的区间内。
全文检索语法:
1
match (col_name1,col_name2,...) against(expr [search_modifier])
1
show variables like'%ft%'; # 查看索引变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
createtable Poetry( id intprimary key auto_increment, name varchar(20), content text, fulltext(content) ); create fulltext index index_content on Poetry(content); altertable Poetry add fulltext index_content(content);
insertinto Poetry values(1,'rain','Rain is falling all around'); insertinto Poetry values(2,'rain','It falls on field and tree'); insertinto Poetry values(3,'rain','It rains on the umbrella here'); insertinto Poetry values(4,'rain','And on the ships at sea');
# 基于全文检索查询含有And内容 select* from Poetry wherematch(content) against('And');
空间索引
1 2 3 4 5 6 7
# 创建超市,并记录经纬度 createtable shop( id intprimary key auto_increment, name varchar(64) notnull, point geometry notnull, spatial key geom_index(point) );
createview v_emp1 as select id,name,salary,salary*30 from emp;
1 2 3 4 5
createview v_emp_new as select name,salary*30as yearSal from v_emp1; select*from v_emp_new;
多表视图
1 2 3 4 5 6 7
createtable v_emp_dept as select concat(e.name,'(',d.name,')') as username,e.salary,e.dept_id,d.name dept_name from emp e, dept d where e.dept_id=d.id; select*from v_emp_dept;
1 2 3 4 5 6 7 8 9
show tables; # 查看当前数据库下的视图语法 rename table old_view_name to new_view_name; # 重命名视图
create database envir; createuser'envir'@'localhost' identified by'envir'; grantallon envir.*to'envir'@'localhost'; set names utf8; use envir; --使用存储过程建表 DROPPROCEDURE IF EXISTS create_table_do; delimiter // CREATEPROCEDURE create_table_do() BEGIN DECLARE i INTDEFAULT1; WHILE i <32 DO SET@STMT= CONCAT("DROP TABLE IF EXISTS `env_detail_",i,"`;"); PREPARE STMT FROM@STMT; EXECUTE STMT; SET@STMT= CONCAT("CREATE TABLE IF NOT EXISTS `env_detail_",i, "`(`name` varchar(20) NOT NULL COMMENT '传感器名称', `srcId` varchar(5) NOT NULL COMMENT '发送端id', `dstId` varchar(5) NOT NULL COMMENT '树莓派系统id', `sersorAddress` varchar(7) NOT NULL COMMENT '模块上传感器地址', `count` int(2) NOT NULL DEFAULT '1' COMMENT '传感器个数', `cmd` varchar(5) NOT NULL DEFAULT '3' COMMENT '指令标号(3表示需要接受数据 16表示需要发送数据)', `data` float(9,4) NOT NULL COMMENT '采集的数据', `status` int(2) NOT NULL DEFAULT '1' COMMENT '状态标示(默认为1表示成功)', `gather_date` timestamp NOT NULL COMMENT '采集时间')ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='数据详情日表';" ); PREPARE STMT FROM@STMT; EXECUTE STMT; SET i = i +1; END WHILE; END// CALL create_table_do();
调用格式
调用存储过程 语法:
1
call 存储过程名字([存储过程参数[,……]])
调用存储函数 语法:
1
select 存储函数名字([函数参数[,……]])
使用show create语句查看存储过程和函数的定义
1
showcreate {procedure|function} 存储过程或存储函数的名称
查看所有函数或者存储过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
-- 格式1:查看数据库中函数和存储过程 SHOWPROCEDURE STATUS WHERE Db ='your_database_name'; SHOWFUNCTION STATUS WHERE Db ='your_database_name'; -- 具体案例 SHOWPROCEDURE STATUS WHERE Db ='briup'; SHOWFUNCTION STATUS WHERE Db ='briup'; -- 格式2:查看指定数据库中 函数和存储过程的名称与类型 SELECT ROUTINE_NAME, ROUTINE_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA ='your_database_name'; -- 具体案例 SELECT ROUTINE_NAME, ROUTINE_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA ='briup';
删除存储过程或存储函数:
1 2 3
DROP {PROCEDURE|FUNCTION} [IF EXISTS] name dropfunction if exists func01; dropprocedure if exists proc01;