【问题标题】:Select query is very slow on my DB table containing a BLOB field在包含 BLOB 字段的数据库表上选择查询非常慢
【发布时间】:2017-02-15 03:12:37
【问题描述】:

请问,如何提高使用 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”可以容纳图像,我知道我可以更好地选择将图像文件链接存储到数据库并将图像文件保存到磁盘,但我不是这样做是因为我的应用程序的性质很特殊。

使用 BLOB 字段是我的应用程序的首选方式,因为我的用户会定期创建和更新“问题”,而我的用户对图像上传、图像 URL 等技术不太了解,他们宁愿复制图像无论它在哪里,并粘贴到我的应用程序提供的富文本框(例如 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代码

谢谢,

【问题讨论】:

  • 请告诉我们SELECTEXPLAIN SELECT ...
  • @Rick,我已经编辑了我的问题以包含您的建议。谢谢。
  • 如果没有ORDER BY,您希望获得哪 20 行?你可以得到 any 20.
  • 使用BLOB而不是TEXT CHARACTER SET utf8的一些原因?
  • 如果您将此_question 表映射到Java 类,请显示它。

标签: mysql performance jpa ejb blob


【解决方案1】:

感谢您的所有努力。

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

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

因此,我重新编写代码以仅在需要时加载 CKeditor,这样从 blob 字段获取的编辑器中的内容也仅在需要时才加载

【讨论】:

    猜你喜欢
    • 2015-03-18
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多