求教下,经常全表, php 跟什么数据库比较搭

2015-02-27 01:28:09 +08:00
 kn007

情况就是相当于学生的信息表,上千万条数据。
并发数还好,单次查询也是0.0006秒。
I/O差,但有足量内存。
使用的是INNODB
目前用着mysql 5.6.22,也做了优化和索引,奈何基本上所有查询都是select全表的。
用的最多的语句是
SELECT count(1) FROM (SELECT * FROM edu WHERE 1=1) as cnd;
SELECT * FROM edu WHERE 1=1 ORDER BY lastupdate desc LIMIT 50 OFFSET 0;
还有insert、update、delete。
没有用到联合索引,就是排序比较多。
现在负载不大,0.21 0.23 0.17。
查询多的时候,1.11 1.10 1.03。
表:
CREATE TABLE edu (
ID bigint(20) unsigned NOT NULL AUTO_INCREMENT,
lastupdate date NOT NULL,
pro varchar(100) NOT NULL,
sdate date NOT NULL,
sc varchar(100) NOT NULL,
cid varchar(100) NOT NULL,
st varchar(100) NOT NULL,
session varchar(100) NOT NULL,
pm int(20) NOT NULL,
PRIMARY KEY (ID),
KEY pro (pro),
KEY sdate (sdate),
KEY sc (sc),
KEY cid (cid),
KEY st (st),
KEY session (session),
KEY lastupdate (lastupdate),
KEY pm (pm)
) ENGINE=InnoDB AUTO_INCREMENT=12679325 DEFAULT CHARSET=utf8
想问下,如果类似这种,可以改成memcache或redis不。。。或者存放到/dev/shm下的其他数据库不?
不知有无意义。。。
请各位指点迷津,谢谢!

2914 次点击
所在节点    数据库
70 条回复
aru
2015-02-27 10:34:39 +08:00
忽然想到一个可能,是不是 lastupdate 只有少数几个值?这样索引就是基本无效果了,mysql会忽略掉索引
cevincheung
2015-02-27 10:39:12 +08:00
稳稳的postgresql
kn007
2015-02-27 10:49:35 +08:00
@aru 不到1G,lastupdate的值确实还不够多,最多30个。
kn007
2015-02-27 10:51:32 +08:00
@cevincheung 我也想啊,不过pgsql不大熟,用了pgsql我还要做优化,同服务器其他项目都用mysql,mysql从参数上已经是最优了,现在就是表和查询看能不能优化。
yangqi
2015-02-27 11:08:40 +08:00
ARL 219有点太长了,应该考虑拆分表

normalize就是数据库的标准化,我不太清楚你那些varchar列的含义,不好判断
jlnsqt
2015-02-27 11:10:37 +08:00
MySQL千万数据的表维护比较慢,可以考虑下MongoDB。本身建的表可能也有问题,字段大都VARCHAR(100),这个往内存放的是否都是按照最大的放的。你可以先用SET profiling = 1,然后执行SQL,在执行show profiles看一下到底是哪个部分最耗时间
kn007
2015-02-27 11:23:54 +08:00
@jlnsqt 我SET profiling = 1,但是SELECT @@profiling一直是0,我执行sql和SHOW PROFILES,返回空。
我用了phpmyadmin的性能分析:
http://i2.tietuku.com/912bffcecf4ed6e6.png
jsq2627
2015-02-27 11:30:59 +08:00
@kn007 http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html

In some cases, MySQL cannot use indexes to resolve the ORDER BY, although it still uses indexes to find the rows that match the WHERE clause. These cases include the following:

The key used to fetch the rows is not the same as the one used in the ORDER BY:
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
kn007
2015-02-27 11:36:11 +08:00
@jsq2627 嗯,看到了。。。有没有啥好办法呢。。。
nine
2015-02-27 11:36:33 +08:00
innodb 要把“主键”和“排序字段”做联合索引,否则count()的时候。。呵呵

已转PG,可以存array, json(jsonb)的,查询起来爽得很,不用搞那么多字段(利益相关:Rails 4.2)
kn007
2015-02-27 11:42:27 +08:00
@yangqi 不懂拆分表。。。求指教。
数据库如何标准化?
varchar没啥意义的,我也不知道定义什么好。innodb又无所谓静态表

ID int(20) unsigned NOT NULL AUTO_INCREMENT, 数字
lastupdate date NOT NULL, 日期(2015-02-27这种)
pro varchar(100) NOT NULL, 中文
sdate date NOT NULL, 日期
sc varchar(100) NOT NULL, 中英文(可能带符号)
cid varchar(100) NOT NULL, 数字(可能会带中英文符号,目前只有数字)
st varchar(100) NOT NULL, 中文数字
session varchar(100) NOT NULL, 数字(可能会带中英文符号,目前只有数字)
pm int(20) NOT NULL, 数字(可能符号)

最长的应该是英文字符,60多个字母,位于sc
kn007
2015-02-27 11:45:32 +08:00
@nine 表字段是不能再少的。目前count是using index的。索引字段应该也是够了,我加了个联合索引了。
pgsql确实有在考虑,毕竟我也算是利用json,但是整个php的db.class就要改了。还要给服务器部署个pgsql,我现在空余内存不多了,剩几百M。mysql是大户,问题服务器上的其他应用也是mysql。囧
mengskysama
2015-02-27 11:47:40 +08:00
贴一张show profile看看?
select全表不知道mysql会不会做cache。。
zhengkai
2015-02-27 12:18:23 +08:00
字段名全是缩写看不明白,你这种要么写全要么字段写注释

这么多 varchar(100) 看着好奇怪,是说有姓名或者学号之类的?感觉应该做几个关联表出去,把那几个 varchar(100) 做成自增id的,这样索引大小能小很多倍
kn007
2015-02-27 13:14:21 +08:00
@mengskysama 看27楼。原文:
我SET profiling = 1,但是SELECT @@profiling一直是0,我执行sql和SHOW PROFILES,返回空。
我用了phpmyadmin的性能分析:
http://i2.tietuku.com/912bffcecf4ed6e6.png
kn007
2015-02-27 13:15:23 +08:00
@mengskysama mysql的query_cache是disable的。我前面做了memcache,仅负责数据1分钟缓存
kn007
2015-02-27 13:46:04 +08:00
@zhengkai 看31楼

ID int(20) unsigned NOT NULL AUTO_INCREMENT, 数字
lastupdate date NOT NULL, 日期(2015-02-27这种)
pro varchar(100) NOT NULL, 中文
sdate date NOT NULL, 日期
sc varchar(100) NOT NULL, 中英文(可能带符号)
cid varchar(100) NOT NULL, 数字(可能会带中英文符号,目前只有数字)
st varchar(100) NOT NULL, 中文数字
session varchar(100) NOT NULL, 数字(可能会带中英文符号,目前只有数字)
pm int(20) NOT NULL, 数字(可能符号)
kn007
2015-02-27 15:35:27 +08:00
略微补充下,现在mysql临时文件位于/dev/shm了
mengskysama
2015-02-27 16:09:13 +08:00
@kn007 感觉挺快的,看楼下怎么说
kn007
2015-02-27 16:11:43 +08:00
@mengskysama 啥感觉挺快的?查询时间么?是挺快的,就是想看看,能不能发挥下各位v友的脑洞,帮忙进一步提升。。filesort长此久往不是事啊

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

https://www.v2ex.com/t/173089

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

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

© 2021 V2EX