Select 在我的包含 BLOB 字段的数据库 table 上查询非常慢

Select query is very slow on my DB table containing a BLOB field

请问,我怎样才能提高 select 使用 BLOB 字段查询的速度。请参阅下面的 table 结构;

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' 可以容纳图像,我知道我可以选择将图像文件 link 存储到 DB 并保存图像文件到磁盘,但我没有这样做,因为我的应用程序的性质很特殊。

使用 BLOB 字段是我的应用程序的首选方式,因为我的用户会定期创建和更新 'questions',而我的用户不太了解图片上传的技术细节,图片 URL 等,宁愿将图像复制到任何位置并粘贴到我的应用程序提供的富文本框(例如 CKEditor)中,然后继续键入 - 就像使用 MS-Word 一样。 CKEditor 可以接受混合文本、图像、tables 等。这个富文本框的全部内容被写入 DB(即 'question_text' 列)。因此需要 BLOB 字段。

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

我怎样才能提高速度,或者我应该怎么做才能提高速度。

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

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 代码

谢谢,

感谢大家的努力。

错误并非真正来自 blob 字段,而是来自显示 blob 字段内容的富文本编辑器 (CKEditor)。我意识到 CKEditor 是一个沉重的 javascript 库(在压缩模式下超过 1000 行,在未压缩模式下超过 22000 行)并且我未能 ajax 并在显示每个问题时延迟加载它(以及options/choices 在每个问题下)。

假设我希望页面显示 100 个问题,每个问题至少包含 4 个 options/choices,这意味着 CKEditor 调用 100x4 (400) 次。

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