1000 多万条数据,我建了索引还是慢,怎么办?

2015-02-05 12:44:52 +08:00
 QQ16748717
create index SelectName on datalist(Name)

select id,Name from DataType where charindex('数学',Name)>0

一1000多万条记录 ,运行完以上的居然查了24秒,太久了,有什么能加快的方法么?
5134 次点击
所在节点    问与答
29 条回复
coldwinds
2015-02-05 12:51:08 +08:00
你确定用到索引了么
QQ16748717
2015-02-05 12:54:01 +08:00
@coldwinds 是不是我写错了?我是新手,不是太懂,以上这样写不是已经可以了么?
denghongcai
2015-02-05 13:01:26 +08:00
你用了function的情况下索引没有太大意义,用contains会比charindex要快,或者试下LIKE
QQ16748717
2015-02-05 13:02:55 +08:00
我的表字段 id,name,info
1 张三 参加了第3学期的24周下等第2节数学课
2 张工 参加了第3学期的14周下等第3节语文课
3 张的 参加了第3学期的21周下等第1节数学课

create index SelectName on datalist(Name)

select id,Name from DataType where charindex('数学',info)>0

一1000多万条记录 ,运行完以上SQL代码查所有上数据课的报名统计,我要怎么写才快?
QQ16748717
2015-02-05 13:03:08 +08:00
@denghongcai 我的表字段 id,name,info
1 张三 参加了第3学期的24周下等第2节数学课
2 张工 参加了第3学期的14周下等第3节语文课
3 张的 参加了第3学期的21周下等第1节数学课

create index SelectName on datalist(Name)

select id,Name from DataType where charindex('数学',info)>0

一1000多万条记录 ,运行完以上SQL代码查所有上数据课的报名统计,我要怎么写才快?
denghongcai
2015-02-05 13:09:35 +08:00
你这表名到底是datalist还是DataType

select id,Name from DataType where info contains "数学"
QQ16748717
2015-02-05 13:15:38 +08:00
@denghongcai 2个都有,但是 datalist的数据最多
em70
2015-02-05 13:15:50 +08:00
这种情况无法使用索引的,info字段做一个全文索引吧,虽然得花比较长时间,但处理完后查询效率就有保证了

mysql不直接支持中文全文索引,需要先做base64处理.或者自己写个程序遍历一下把学科信息提取放一个独立字段里.
denghongcai
2015-02-05 13:20:49 +08:00
如果这种查询是很频繁的,比较好的方法是先遍历一遍当前的数据,把所有课的频次都提取出来。如果需要对数据进行增加或者删除修改,直接改你提取后的数据就好了,相当于做一个专用的cache
QQ16748717
2015-02-05 13:22:09 +08:00
@em70 我是SQL2008 哭了~怎么办
tabris17
2015-02-05 13:22:49 +08:00
你需要的是全文检索
rrfeng
2015-02-05 13:34:03 +08:00
我怎么觉得 info 需要拆分呢……
QQ16748717
2015-02-05 13:36:52 +08:00
@rrfeng 拆分?不明白
lincanbin
2015-02-05 13:38:13 +08:00
你这个会全表扫描,索引不是建了就会快的
siw
2015-02-05 13:44:06 +08:00
这个ID好像全表扫,

CREATE NONCLUSTERED SelectName ON datalist(Name)
INCLUDE (ID);

试试,
ETiV
2015-02-05 13:56:41 +08:00
重新设计表结构吧...

id,name,info
1 张三 参加了第3学期的24周下等第2节数学课


id, name, term, week, class, class_name
1, 张三 3, 24, 2, 数学
msg7086
2015-02-05 14:00:07 +08:00
首先你先要了解范式。
所以你先要学习数据库基础知识。

你这种结构如果要用数据库做快速查询的话,做不到吧。
别说千万,十万条都够你卡一下了。
Ransford
2015-02-05 14:02:03 +08:00
分区 or 换数据库
lbp0200
2015-02-05 14:03:28 +08:00
不符合数据库设计三范式。
你是学生吧?在做学校的选课程序?
iamxi
2015-02-05 14:10:55 +08:00
额,1000万+的数据不多。只是你要对表有点改动而已。不要直接把“第3学期的24周下等第2节数学课”这样的数据放入数据库,改应该改造成 学期、周、当天课程序号、课程名称,学期、周和课程号都应该是数字,至于课程名称新建课程的信息表,把课程的主键放到那张数据表中,比如数学的ID是1,那
1 张三 参加了第3学期的24周下等第2节数学课
变成
1 张三 3 24 2 1

如果可以,应该有个状态标识参加了还是缺席了,如1参加,缺席
那数据行就变成 1 张三 1 3 24 2 1
如果已经有学生的信息表,那张三也应该和学生信息表做关联,使用学生信息表的主键。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/168458

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX