1
coldwinds 2015-02-05 12:51:08 +08:00
你确定用到索引了么
|
2
QQ16748717 OP @coldwinds 是不是我写错了?我是新手,不是太懂,以上这样写不是已经可以了么?
|
3
denghongcai 2015-02-05 13:01:26 +08:00
你用了function的情况下索引没有太大意义,用contains会比charindex要快,或者试下LIKE
|
4
QQ16748717 OP 我的表字段 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代码查所有上数据课的报名统计,我要怎么写才快? |
5
QQ16748717 OP @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代码查所有上数据课的报名统计,我要怎么写才快? |
6
denghongcai 2015-02-05 13:09:35 +08:00
你这表名到底是datalist还是DataType
select id,Name from DataType where info contains "数学" |
7
QQ16748717 OP @denghongcai 2个都有,但是 datalist的数据最多
|
8
em70 2015-02-05 13:15:50 +08:00
这种情况无法使用索引的,info字段做一个全文索引吧,虽然得花比较长时间,但处理完后查询效率就有保证了
mysql不直接支持中文全文索引,需要先做base64处理.或者自己写个程序遍历一下把学科信息提取放一个独立字段里. |
9
denghongcai 2015-02-05 13:20:49 +08:00
如果这种查询是很频繁的,比较好的方法是先遍历一遍当前的数据,把所有课的频次都提取出来。如果需要对数据进行增加或者删除修改,直接改你提取后的数据就好了,相当于做一个专用的cache
|
10
QQ16748717 OP @em70 我是SQL2008 哭了~怎么办
|
11
tabris17 2015-02-05 13:22:49 +08:00
你需要的是全文检索
|
12
rrfeng 2015-02-05 13:34:03 +08:00
我怎么觉得 info 需要拆分呢……
|
13
QQ16748717 OP @rrfeng 拆分?不明白
|
14
lincanbin 2015-02-05 13:38:13 +08:00 via Android
你这个会全表扫描,索引不是建了就会快的
|
15
siw 2015-02-05 13:44:06 +08:00
这个ID好像全表扫,
CREATE NONCLUSTERED SelectName ON datalist(Name) INCLUDE (ID); 试试, |
16
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, 数学 |
17
msg7086 2015-02-05 14:00:07 +08:00
首先你先要了解范式。
所以你先要学习数据库基础知识。 你这种结构如果要用数据库做快速查询的话,做不到吧。 别说千万,十万条都够你卡一下了。 |
18
Ransford 2015-02-05 14:02:03 +08:00
分区 or 换数据库
|
19
lbp0200 2015-02-05 14:03:28 +08:00
不符合数据库设计三范式。
你是学生吧?在做学校的选课程序? |
20
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 如果已经有学生的信息表,那张三也应该和学生信息表做关联,使用学生信息表的主键。 |
21
QQ16748717 OP @ETiV 主要是表是很久很久以前做的了,做这个的老师都转成教授了,现在是我接手,有上千万条数据,很难转呀
|
22
QQ16748717 OP @msg7086 这个是以前的学校老师做的
|
23
QQ16748717 OP @lbp0200 我也很为难
|
24
idblife 2015-02-05 14:59:51 +08:00
上千万的数据还算多?
在索引列上使用表达式,索引是不生效的。 |
25
pandada8 2015-02-05 15:08:27 +08:00
向楼上说的改改表结构吧
能停机的话就写个Python脚本啥的转换下,然后切过去 |
26
youxiachai 2015-02-05 15:10:23 +08:00
嗯..把硬盘换成 ssd.. 会不会有质的飞跃呢...
|
27
shakoon 2015-02-05 15:11:22 +08:00
这个表的结构建得有问题,重新建一个吧,参照16楼。如果非得用到现在这个结构,再建一个视图把字段拼出来就是了。
|
28
ETiV 2015-02-05 15:11:57 +08:00
看来是个千古大坑...
如果为了保留兼容性, 建议不去掉 info 字段, 同时像我上面写的, 增加那些字段. 这样老的程序还可以用, 新的程序查起来也不会太痛苦. |
29
QQ16748717 OP @ETiV 只能是按你说的了,真是前人不做好,后人就遭殃了
|