我的数据库表上的选择查询非常慢,包含BLOB字段

时间:2016-10-06 11:32:53

标签: mysql performance jpa ejb blob

请问,如何使用BLOB字段提高选择查询的速度。见下表结构;

CREATE TABLE IF NOT EXISTS `mydb`.`question_` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`question_text` BLOB(90000) NOT NULL,
`comprehension_id` INT UNSIGNED NOT NULL DEFAULT '0',
`MCQ` TINYINT(1) NOT NULL DEFAULT '0',
`subject__id` INT UNSIGNED NOT NULL,
`col1` INT NULL,
`col2` INT NULL,
`col3` INT NULL,
`col4` INT NULL,
`col5` INT NULL,
`col6` INT NULL,
`col7` INT NULL,
PRIMARY KEY (`id`),
INDEX `fk_question__subject_1_idx` (`subject__id` ASC),
CONSTRAINT `fk_question__subject_1`
FOREIGN KEY (`subject__id`)
REFERENCES `mydb`.`subject_` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;

我需要BLOB字段,以便列' question_text'可以容纳图像,我知道我可以更好地使用将图像文件链接存储到DB并将图像文件保存到磁盘的替代方法,但我没有这样做,因为我的应用程序的性质很奇怪。 / p>

使用BLOB字段是我的应用程序的首选方式,因为我的用户会定期创建和更新“问题”,而我的用户并不精通图像上传,图片网址的技术细节等等,宁愿将图像复制到任何地方并粘贴到我的应用程序提供的富文本框(例如CKEditor)中,并继续键入 - 就像使用MS-Word一样。 CKEditor可以接受混合文本,图像,表格等。此富文本框的全部内容将写入DB(即' question_text'列)。因此需要一个BLOB字段。

但我面临的挑战是,在后端管理问题时,问题页需要更长的时间才能加载。

如何提高速度,或者我应该采取哪些措施来提高速度。

我的应用程序基于javaee堆栈(JPA,EJB,JSP,Servlet,Glassfish)构建,下面是用于显示问题列表的选择查询...

SELECT  q.id, CONVERT(q.question_text USING UTF8), q.subject__id,
        q.comprehension_id, q.MCQ
    FROM  question_ q
    WHERE  q.subject__id = 13
    limit  1, 20 

您还可以在https://www.dropbox.com/s/on2wv92c71owx2d/Question.java?dl=0上查看通过ORM映射到question_table的Question.java代码

谢谢,

1 个答案:

答案 0 :(得分:1)

感谢您的所有努力。

故障并非真正来自blob字段,而是来自显示blob字段内容的富文本编辑器(CKEditor)。我意识到CKEditor是一个沉重的JavaScript库(在压缩模式下超过1000行,在未压缩模式下超过22000行)并且在显示每个问题时(以及每个问题下的选项/选项)我没有ajax并且懒得加载它。

让我们说我希望页面显示100个问题,每个问题至少包含4个选项/选项,这意味着对CKEditor进行100x4(400)次调用。

所以我已经修改了我的代码,只在需要时才加载CKeditor,这样编辑器中从blob字段获取的内容也只在需要时加载