有这样一个表mytable
A bigint(20) primary key.
B varchar(2000),
C varchar(500),
D tinyint(2).表中有300万条记录。现在要select * from mytable where A=? 这样的语句处理时间小于1毫秒,insert,update操作也是很简单的insert mytable (A,B,C,D) values(?,?,?,?); update也是单表根据key更新。
我测试大部分时间都超过1毫秒了,偶然小于1毫秒,大家有什么优化方案没有,数据库是MYSQL.
我想了,更新和插入可以采取异步更新到数据库的方式,但是查询呢??说明:如果同时把这些数据存在应用系统的内存,是可以解决的,但是耗费内存太大,而且不能持久保存,所以单纯这个方案否定了。大家帮忙看看,谢谢了。
A bigint(20) primary key.
B varchar(2000),
C varchar(500),
D tinyint(2).表中有300万条记录。现在要select * from mytable where A=? 这样的语句处理时间小于1毫秒,insert,update操作也是很简单的insert mytable (A,B,C,D) values(?,?,?,?); update也是单表根据key更新。
我测试大部分时间都超过1毫秒了,偶然小于1毫秒,大家有什么优化方案没有,数据库是MYSQL.
我想了,更新和插入可以采取异步更新到数据库的方式,但是查询呢??说明:如果同时把这些数据存在应用系统的内存,是可以解决的,但是耗费内存太大,而且不能持久保存,所以单纯这个方案否定了。大家帮忙看看,谢谢了。
一般来讲,SELECT速度>insert,update、DELETE,
如果是大量插入数据,用SOURCE OR LOAD DATA
有多少索引?show create table xx
show index from xx看一下.
存储引擎Myisam.
另外,楼上说的cache是查询缓存吗,我考虑过这个,但是mysql 的query cache在update操作后,缓存中会清除对应的KEY的缓存,我的业务需求是:select update的频率差不多,一个事务一般先select ,然后update,这样看来,好像查询缓存用不上。
SELECT SQL_NO_CACHE * FROM ...
http://blog.csdn.net/chuan122345/archive/2009/12/11/4985463.aspx1秒 =1000000000000000飞秒 =1000000000000皮秒 = 1000000000纳秒 = 1000000微秒 = 1000毫秒
1秒 = 1000000000000皮秒 = 1000000000纳秒 = 1000000微秒 = 1000毫秒
1秒 = 1000000000纳秒 = 1000000微秒 = 1000毫秒
1秒 = 1000000微秒 = 1000毫秒
1秒 = 1000毫秒
比数据库高很多。 一个是直接通过操作系统操作磁盘IO,一个是提交个数据库系统,然后由数据库系统来操作操作系统写磁盘IO
这一点无需置疑。当然也和你的代码效率有关。
http://blog.csdn.net/forever_feng/archive/2009/10/16/4679233.aspx
那个没什么意义,1秒CPU周期再多,架不住做到事情多。
光遍历一遍“select * from mytable where A=100”这三十几个字符,可能就需要大概100个周期,这还不是解析SQL语句。
感觉,还是尽量使用CPU+内存,避免disk i/o。如果用索引的话,最好利用hash类型的索引,而不是btree(但不知道PK可不可以hash,貌似好像不可以)
CREATE TABLE `test`.`a` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`text` varchar(45) NOT NULL,
PRIMARY KEY (`id`) USING HASH,
KEY `Index_2` (`text`) USING HASH
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这样读写操作都在内存里进行,效率应该要好一些
如果用MySql,楼主可以尝试一下:
假设楼主的并发量不大的情况下
1,采用MyISAM引擎.
2,以硬盘空间换取时间,楼主的varchar字段能否给成固定长度的char字段。这样每行的长度固定,mysql处理时间上更快。
3,关闭QueryCache,因为你的表老修改,开QueryCache降低性能。
4,查看MYI文件大小,在内存中KEY_Buffer_Size大小一定要比MYI文件大。确保所有关于字段A的索引都能装入内存(估计300万记录,至少需要60M吧,楼主的硬件语序的话,设置256M能成?)
5,增加一个启动时运行的Sql脚本,在启动的时候就将索引load到内存。
6,考虑插入锁优先级比Select锁低。
7,Primary Key的优化,根据楼主A字段的值,查看是否有更好的优化方式,是采用Btree还是hash等。
insert .... ON DUPLICATE KEY UPDATE ....