【发布时间】:2022-01-25 15:12:31
【问题描述】:
有人问我以下问题:
对于以下每个查询,设计一个或多个索引 假设表有足够的行会加快速度。对于每个 查询提交将索引添加到相关的 SQL 语句 别名中的表。
a.
SELECT film_id, description FROM film WHERE description LIKE 'A B ';b.
SELECT film_id, description FROM film_text WHERE description LIKE 'A B ';c。
SELECT f.film_id, f.title, a.last_update FROM film AS f INNER JOIN film_actor AS fa ON f.film_id = fa.film_id INNER JOIN actor AS a ON fa.actor_id = a.actor_id WHERE f.rating = 'G' AND a.last_update `>= '2006-02-15 04:34:33';
我尝试在描述列上创建索引,但收到错误代码 1770 : BLOB/TEXT column 'description' used in key specification without a key length
它是为此目的索引的正确列吗?如果是这样,我该如何解决这个问题?如果不是,索引的正确列是什么?
表格由
CREATE TABLE `film` (
`film_id` smallint unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`description` text,
`release_year` year DEFAULT NULL,
`language_id` tinyint unsigned NOT NULL,
`original_language_id` tinyint unsigned DEFAULT NULL,
`rental_duration` tinyint unsigned NOT NULL DEFAULT ''3'',
`rental_rate` decimal(4,2) NOT NULL DEFAULT ''4.99'',
`length` smallint unsigned DEFAULT NULL,
`replacement_cost` decimal(5,2) NOT NULL DEFAULT ''19.99'',
`rating` enum(''G'',''PG'',''PG-13'',''R'',''NC-17'') DEFAULT ''G'',
`special_features` set(''Trailers'',''Commentaries'',''Deleted Scenes'',''Behind the Scenes'') DEFAULT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`film_id`),
KEY `idx_title` (`title`),
KEY `idx_fk_language_id` (`language_id`),
KEY `idx_fk_original_language_id` (`original_language_id`),
CONSTRAINT `fk_film_language` FOREIGN KEY (`language_id`) REFERENCES `language` (`language_id`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `fk_film_language_original` FOREIGN KEY (`original_language_id`) REFERENCES `language` (`language_id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1002 DEFAULT CHARSET=utf8mb3
谢谢!
【问题讨论】:
-
问题不完整。请包括表格的定义。
-
为什么不指定密钥长度?
-
@TheImpaler,已编辑,我还有什么需要说明的吗?
-
@Jov 创建具有
TEXT数据类型(如description)成员的索引时,数据库通常只索引它的第一个字符; MySQL 询问您要索引多少个description字符。例如,如果您想要基于前 50 个字符的索引,您可以这样做:create index ix1 on film (description(50));。出于性能原因,您不能索引整个事物。 -
@theImpaler 酷,非常感谢:)
标签: mysql sql indexing blob sql-like