回表:先确定主键ID,在查询行级记录。
覆盖索引:
create table(
id int(10) primary,
name varchar(32) not null,
sex varchar(10) not null,
index(name)
)
select name,id from table where name='zhangsan'
这时候会在name里面找到id和name,就可以不用回表,提高查询速度
而当select id,name,sex from table where name='zhangsan'
这个时候就命中name索引,索引的叶子节点会存储主键id,但是不会存储sex,因此需要回表。
而将索引升级成联合索引就不一样了,
create table(
id int(10) primary,
name varchar(32) not null,
sex varchar(10) not null,
index (name,sex)
)
这时候就会使用覆盖索引。
使用覆盖索引进行优化:表table1(id,name,sex)、
select count(name) from table1;
可以优化为: alter table table1 add key name
select count (name) from table1;
这样子就会进行索引覆盖
如何进行索引修改呢?
方法一:
若一开始有索引:
先删掉:alter table table1 drop index index1;
再创建 alter table table1 add unique index1(name,sex) using btree;//创建唯一索引
alter table table1 add index index1(name,sex)//创建普通索引
alter table table1 add primary key (id)//创建主键索引
方法二 :
create index index2 on table1(name)
create unique index3 on table1(name)
存储过程:
create proc proc1(
@bl1 varchar(10)=‘zhangsan’//全局变量
@bl2 varchar(10)
as
begin
declare @bl2 varchar(10)//局部变量
set @bl2='wangwu'
set @bl3=(select name from table1)
select
end
)
exec proc1 'lisi'
也可以把变量的内容输出,使用output
create proc StuProc
@sname varchar(100),
@IsRight int output //传出参数
as
if exists (select S#,Sname,Sage,Ssex from student where sname=@sname)
set @IsRight =1
else
set @IsRight=0
go
declare @IsRight int
exec StuProc '赵雷' , @IsRight output
select @IsRight
在SQL Server查询编辑器窗口中用CREATE PROCEDURE语句创建存储过程PROC_InsertEmployee,用于实现向员工信息表(tb_Employee)中添加信息,同时生成自动编号
其SQL语句如下:
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = 'Proc_InsertEmployee'
AND type = 'P')
DROP PROCEDURE Proc_InsertEmployee
GO
CREATE PROCEDURE Proc_InsertEmployee
@PName nvarchar(50),
@PSex nvarchar(4),
@PAge int,
@PWage money
AS
begin
declare @PID nvarchar(50)
select @PID=Max(员工编号) from tb_Employee
if(@PID is null)
set @PID='P1001'
else
set @PID='P'+cast(cast(substring(@PID,2,4) as int)+1 as nvarchar(50))
begin
insert into tb_Employee values(@PID,@PName,@PSex,@PAge,@PWage)
end
end
go