老问题了,我目前用hibernate开发,使用native sql语言,但数据库超过50万条时,查询速度慢的让人
难以忍受,大约只有3万条/秒。
现在只有一张表,记录系统日志的,表定义如下
DROP TABLE IF EXISTS `traffic`.`syslog`;
CREATE TABLE `traffic`.`syslog` (
`syslog_id` int(10) unsigned NOT NULL auto_increment,
`logcategory` varchar(45) NOT NULL,
`securitylevel` varchar(45) NOT NULL,
`action` varchar(45) NOT NULL,
`type` varchar(45) NOT NULL,
`srcip` varchar(45) NOT NULL,
`dstip` varchar(45) NOT NULL,
`srcport` varchar(45) NOT NULL,
`dstport` varchar(45) NOT NULL,
`protocol` varchar(45) NOT NULL,
`message` varchar(500) NOT NULL,
`createtime` timestamp NOT NULL default CURRENT_TIMESTAMP,
`ext1` varchar(45) default NULL,
`ext2` varchar(45) default NULL,
`ext3` varchar(45) default NULL,
`device_id` int(10) unsigned default NULL,
PRIMARY KEY (`syslog_id`),
KEY `FK_syslog_device_id` (`device_id`),
CONSTRAINT `FK_syslog_device_id` FOREIGN KEY (`device_id`) REFERENCES `devices` (`device_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;现在表里面有100万条数据,如果多条查询,希望反应速度可以控制在10秒以内。
请问需要对数据库做哪些调整?
查询只是单表,不关联其他表,而且我没有建索引。
难以忍受,大约只有3万条/秒。
现在只有一张表,记录系统日志的,表定义如下
DROP TABLE IF EXISTS `traffic`.`syslog`;
CREATE TABLE `traffic`.`syslog` (
`syslog_id` int(10) unsigned NOT NULL auto_increment,
`logcategory` varchar(45) NOT NULL,
`securitylevel` varchar(45) NOT NULL,
`action` varchar(45) NOT NULL,
`type` varchar(45) NOT NULL,
`srcip` varchar(45) NOT NULL,
`dstip` varchar(45) NOT NULL,
`srcport` varchar(45) NOT NULL,
`dstport` varchar(45) NOT NULL,
`protocol` varchar(45) NOT NULL,
`message` varchar(500) NOT NULL,
`createtime` timestamp NOT NULL default CURRENT_TIMESTAMP,
`ext1` varchar(45) default NULL,
`ext2` varchar(45) default NULL,
`ext3` varchar(45) default NULL,
`device_id` int(10) unsigned default NULL,
PRIMARY KEY (`syslog_id`),
KEY `FK_syslog_device_id` (`device_id`),
CONSTRAINT `FK_syslog_device_id` FOREIGN KEY (`device_id`) REFERENCES `devices` (`device_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;现在表里面有100万条数据,如果多条查询,希望反应速度可以控制在10秒以内。
请问需要对数据库做哪些调整?
查询只是单表,不关联其他表,而且我没有建索引。
解决方案 »
- 請問mysql cursor可以用變數開啟嗎?
- 求SQL代码如何实现
- WinXP 下使用 MySQL 命令 : source filename, 如何记录 log ?
- 请教,如何在mysql中用load data才能让导入数据速度达到最高?
- 请教类\子类的表如何设置最好?
- mysql数据库怎么样存储中文?
- 求一条SQL语句
- 初学SQL,请问一些初级的索引问题
- mysql用函数如何实现oracle connect by nocycle prior类似的功能
- 为什么这条SQL在服务器上能执行,在我本机却失败了呢?
- 求救:出售房源的数据库,读取慢
- MySQL连接池设置过大出现的问题,怎么解决????
具体要加什么样的索引,哪些索引,需要根据你的select 查询语句而定。
1 createtime 上加索引
2 删除外键,由程序去控制更新【外键很消耗数据库资源,不建议使用】
3 到了两三百万就需要考虑分区或者是数据迁移
Select Max(ID) From (
Select ID From cyclopedia Order By ID limit 90001
) As tmp) limit 100;========================================Select * From cyclopedia Where ID>=(Select ID From cyclopedia limit 90000,1)limit 100;速度明显改善,执行效率
第一条查询 9万条 0.23 s // 90万条2.45 s
第二条查询 9万条 0.17 s // 90万条1.55 s