分页
Limit语法:
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offsetLIMIT子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT接受一个或两个数字参数。参数必须是一个整数常量。 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。
支持 limit # offset # 语法:
SELECT * FROME table LIMIT 5,10; //检索记录行6-15 // 检索指定偏移量到数据库表记录行结束的位置,可指定第二个参数为 -1 SELECT * FROM table LIMIT 100,-1 // 检索table中 100 - last 的数据 // 检索table中前五个的数据 LIMIT 5 等价于 0,5 SELECT * FROM table LIMIT 5
不同数据量的读取效率对比:
offset数据比较小的时候
SELECT * FROM table LIMIT 5,10多次运行,时间保持在0.0004-0.0005之间
SELECT * FROM table WHERE id >= ( SELECT id FROM table ORDER BY id LIMIT 10,1 ) LIMIT 10多次运行,时间保持在0.0005-0.0006之间。所有,在offset较小的时候,直接使用limit效率会高点!
offset数据比较大的时候
SELECT * FROM table LIMIT 10000,10多次运行,时间保持在0.0187秒左右。
SELECT * FROM table WHERE id >=( SELECT id FROM table ORDER BY id LIMIT 10000,1 ) LIMIT 10多次运行,时间保持在0.0061秒左右,是前者的1/3左右。所以,offset较大时,使用后者效率会高!这是用了id做索引的结果。
LIMIT性能优化:
method 1:
SELECT * FROM table WHERE id>=( SELECT Max(id) FROM ( SELECT id FROM table ORDER BY id LIMIT 90001 ) AS tmp ) LIMIT 100method 2:
SELECT * FROM table WHERE id>=( SELECT Max(id) FROM( SELECT id FROM table ORDER BY id LIMIT 90000,1 ) AS tmp ) LIMIT 100;同样是取90000条后的100条数据,第2种方法会快点。因为第1种方法是先取前90001条记录,取其中最大一个id值作为起始标识,然后利用它快速定位下100条数据;
然后第2种方法是只取最后一条记录,然后取id值作为起始标识定位100条记录。
第二种方法缩减:
SELECT * FROM table WHERE id >= ( SELECT id FROM( SELECT id FROM table ORDER BY ID LIMIT 90000,1 )As tmp ) LIMIT 100省去Max运算,一般id都是递增
分页数据性能优化:
1、对于数据量较大数据表,可以建立主键和索引字段建立索引表,通过索引表查询相应的主键,在通过主键查询数据量的数据表;
2、如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键!这样能提高读取速度
3、利用in:先通过where条件取得相应的主键值,然后利用主键值查询相应的字段值。
数据表添加默认值
CREATE TABLE student( stu_id int indentity(1,1) primary key, -- 设置主键 stu_name varchar(10) unique not null, -- 添加唯一约束 stu_age int Check(stu_age between 18 and 100), -- 添加检查约束 18~100 stu_addr varchar(20) default 'chain', -- 添加默认约束值 chain stu_deal varchar(20) ) go
数据表列的整理
use City; go CREATE TABLE A( id int identity(1,1) primary key not null, name nvarchar(100) ) go -- 添加列 Alter Table A add number nvarchar(100) -- 修改列的类型 Alter table A alter COLUMN number int -- 删除列 ALTER TABLE A DROP COLUMN number