表内容:
create table if not exists sms_tb(name text unique,passwd text,expire_time bigint,create_time bigint,mac text);
create table if not exists qrcode_tb(mac text unique,name text,expire_time bigint,create_time bigint,note text);
create table if not exists temporary_tb(name text unique,passwd text,expire_time bigint,create_time bigint,note text);
每个表100W条数据,现在有几个需求:
1、update sms_tb set passwd=****** where name='123456789';
根据name查找到相应数据执行update,delete操作;
2、SELECT * FROM sms_tb ORDER BY create_time DESC LIMIT 25 OFFSET 0;
根据create_time找出创建时间最大的25个数据;
3、select count(*) from sms_tb where create_time>=0 and create_time<=1383525367;
查找创建时间满足区间要求的数据数量;
我现在创建的索引是以create_time创建的。现在增删改的速度是0.1秒左右,查找时与未添加索引时优化的效果也不明显
大神们有没有好的解决方案。
1、对text字段建索引没有明显升速度
2、create_time 可以大幅增加order by的速度
3、由于索引的使用限制,索引只对第一个不等好有效,效果也不明显。
这是我经过测试得出的结论,大神们有没有好的提升效率的方案,如有帮助另送100分
你好,谢谢你的回答,不过,创建单个的create_time索引确实可以提升速度,但不是很明显,我想知道如何建索引或者如何写sql语句可以使他的速度提升。
追答在text上建立索引,效率没明显提高,这是跟数据相关的。1是看选择率,就是选出的记录总数占所有记录总数的比例,太高了索引无效,因为数据库都是按块存储的,每次读至少一块,最后的结果可能是索引读一遍,但数据所有的块还是全读了一遍;2是看数据分布,譬如每块能存100条记录,name='123456789'的记录总数虽然只总记录数的1%,但正好每块都有一条,这样依然会把所有数据块都要读一遍,此时先读索引也提高不了效率,象oracle之类的大型数据库就会选择全表扫描。