优化 MYSQL Select 大型 table 查询
Optimize MYSQL Select query in large table
鉴于 table:
CREATE TABLE `sample` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`vendorid` VARCHAR(45) NOT NULL,
`year` INT(10) NOT NULL,
`title` TEXT NOT NULL,
`description` TEXT NOT NULL
PRIMARY KEY (`id`) USING BTREE
)
Table 规模:超过 700 万。 除了 id.
,所有字段都不是唯一的
简单查询:
SELECT * FROM sample WHERE title='milk'
需要 45 到 60 秒才能完成。
尝试在标题和描述中添加唯一索引,但出现 1170 错误。
我该如何优化它?非常感谢您的建议。
TEXT
列需要 prefix indexes -- 不可能索引它们的全部内容;它们可能太大了。而且,如果列值不唯一,则不要使用 UNIQUE 索引;他们不会工作。
试试这个:
ALTER TABLE simple ADD INDEX title_prefix (title(64));
专业提示 对于需要在 WHERE 语句中使用的列,请尽量使用 VARCHAR(n)
,其中 n
小于 768。避免 TEXT
和其他 blob types 除非你绝对需要它们;它们会导致您的数据库服务器运行效率低下。
鉴于 table:
CREATE TABLE `sample` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`vendorid` VARCHAR(45) NOT NULL,
`year` INT(10) NOT NULL,
`title` TEXT NOT NULL,
`description` TEXT NOT NULL
PRIMARY KEY (`id`) USING BTREE
)
Table 规模:超过 700 万。 除了 id.
,所有字段都不是唯一的简单查询:
SELECT * FROM sample WHERE title='milk'
需要 45 到 60 秒才能完成。
尝试在标题和描述中添加唯一索引,但出现 1170 错误。
我该如何优化它?非常感谢您的建议。
TEXT
列需要 prefix indexes -- 不可能索引它们的全部内容;它们可能太大了。而且,如果列值不唯一,则不要使用 UNIQUE 索引;他们不会工作。
试试这个:
ALTER TABLE simple ADD INDEX title_prefix (title(64));
专业提示 对于需要在 WHERE 语句中使用的列,请尽量使用 VARCHAR(n)
,其中 n
小于 768。避免 TEXT
和其他 blob types 除非你绝对需要它们;它们会导致您的数据库服务器运行效率低下。