求教下,经常全表, 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下的其他数据库不?
不知有无意义。。。
请各位指点迷津,谢谢!

2896 次点击
所在节点    数据库
70 条回复
yangqi
2015-02-27 01:36:17 +08:00
SELECT count(1) FROM (SELECT * FROM edu WHERE 1=1) as cnd;

这个怎么想的,难道不直接select count(*) from edu?
yangqi
2015-02-27 01:40:05 +08:00
另外你每个列都加索引, 相当于索引的大小和整个表的差不多了,估计是不可能全部放到内存里缓存的,这里需要优化,另外有足量内存的话增加innodb_buffer_pool_size
kn007
2015-02-27 01:41:03 +08:00
@yangqi 这个我看速度一样没改,我用的w2grid其实,这是自带的命令。
kn007
2015-02-27 01:41:49 +08:00
innodb_buffer_pool_size已经是足够大了,剩余空间还有很多。
因为每个列都可能被排序。所以都加上索引
kn007
2015-02-27 01:42:02 +08:00
@yangqi innodb_buffer_pool_size已经是足够大了,剩余空间还有很多。
因为每个列都可能被排序。所以都加上索引
kn007
2015-02-27 01:42:20 +08:00
@yangqi 已改正,谢谢
ferock
2015-02-27 01:52:00 +08:00
主索引一次sql 执行一般只有一个是最有效的,多看看查询执行计划
kn007
2015-02-27 01:55:44 +08:00
@ferock 查询计划没问题,Using index
kn007
2015-02-27 01:58:39 +08:00
@ferock 看了下,
SELECT * FROM edu WHERE 1=1 ORDER BY lastupdate desc LIMIT 50 OFFSET 0;
用了filesort,囧。这句还能怎么提升不
kn007
2015-02-27 02:06:13 +08:00
@ferock 看了select字段可以use index,但是太多类似表了,囧
kn007
2015-02-27 02:09:59 +08:00
@ferock select所有字段,一样use filesort。。
kn007
2015-02-27 02:12:11 +08:00
超过2个字段就use filesort。晕死
kn007
2015-02-27 02:20:22 +08:00
@ferock select 字段(NULL)比select *效率(use filesort)反而慢多了。。。。。
兄弟最这条语句有什么建议么?谢谢。
SELECT * FROM edu WHERE 1=1 ORDER BY lastupdate desc LIMIT 50 OFFSET 0;

lastupdate用的最多,其他可能也会用到,除了ID
kn007
2015-02-27 02:28:04 +08:00
@ferock 做了联合索引 using index; using filesort,速度跟以前差不多
kn007
2015-02-27 02:34:50 +08:00
@ferock
联合索引ID:
mysql> EXPLAIN SELECT * FROM edu WHERE 1=1 ORDER BY lastupdate desc LIMIT 100 OFFSET 0;
+----+-------------+------------+-------+---------------+------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+---------------+------+---------+------+------+-----------------------------+
| 1 | SIMPLE | edu | index | NULL | ID | 1528 | NULL | 12679325 | Using index; Using filesort |
+----+-------------+------------+-------+---------------+------+---------+------+------+-----------------------------+
1 row in set (0.00 sec)

mysql> show status like 'handler_read%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Handler_read_first | 1 |
| Handler_read_key | 1 |
| Handler_read_last | 0 |
| Handler_read_next | 0 |
| Handler_read_prev | 0 |
| Handler_read_rnd | 0 |
| Handler_read_rnd_next | 241 |
+-----------------------+-------+
7 rows in set (0.00 sec)




无索引:
mysql> EXPLAIN SELECT * FROM edu WHERE 1=1 ORDER BY lastupdate desc LIMIT 100 OFFSET 0;
+----+-------------+------------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | edu | ALL | NULL | NULL | NULL | NULL | 12679325 | Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)

mysql> show status like 'handler_read%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Handler_read_first | 1 |
| Handler_read_key | 1 |
| Handler_read_last | 0 |
| Handler_read_next | 0 |
| Handler_read_prev | 0 |
| Handler_read_rnd | 0 |
| Handler_read_rnd_next | 241 |
+-----------------------+-------+
7 rows in set (0.00 sec)
yangqi
2015-02-27 09:17:25 +08:00
你这个要从表的设计上来优化了,先看看你average row length,ID为啥要用bigint不用int, unsigned int最大值42亿,难道还不够么?另外这张表还能normalize么?
kakaryan
2015-02-27 09:37:22 +08:00
动不动就是全表,何必硬来,上sphinx.
kn007
2015-02-27 10:27:15 +08:00
@yangqi normalize?不懂。
默认bigint,我改下。
ARL是219
kn007
2015-02-27 10:28:12 +08:00
@kakaryan 谢谢,没用过这货,回头看看
aru
2015-02-27 10:32:09 +08:00
SELECT * FROM edu WHERE 1=1 ORDER BY lastupdate desc LIMIT 50 OFFSET 0;
对 lastupdate 做索引,不应该会是filesort,你的表到底做了什么?
另外,你的数据库文件含索引一共多大?

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

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

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

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

© 2021 V2EX