Mysql 向表中添加索引
我有一个从服务器端获取数据的datatable,我想通过添加索引来优化我的表,以便排序更快(现在对60K行进行排序大约需要7秒钟) 我的“将创建语句复制到剪贴板”如下所示:Mysql 向表中添加索引,mysql,indexing,Mysql,Indexing,我有一个从服务器端获取数据的datatable,我想通过添加索引来优化我的表,以便排序更快(现在对60K行进行排序大约需要7秒钟) 我的“将创建语句复制到剪贴板”如下所示: CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `password` char(128) COLLATE utf
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`password` char(128) COLLATE utf8_unicode_ci NOT NULL,
`salt` char(5) COLLATE utf8_unicode_ci NOT NULL,
`joined` int(10) unsigned NOT NULL,
`name` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
`surname` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
`role` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`photo` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`user_type` int(11) DEFAULT NULL,
`user_owner` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=81634 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
我遇到的问题是,如果我使用这个:
ALTER TABLE `users` ADD INDEX (`email`, `name`, `surname`, `user_type`) ;
只有电子邮件被索引(至少只有电子邮件列可以快速排序)。我不确定我能做些什么来添加其他索引列(或者它是否真的有利于优化它)。您必须为要使用的每个列添加单独的索引 但是请注意:MySQL只能对where子句或ORDERBY使用索引。但不是两个都同时出现。除非,否则两者的索引相同。但在这种情况下,where子句必须是常量(即,它必须匹配单个值)
另请参见:@luqita发布双向解释计划。@luqita如果双向解释显示相同的内容,则双向解释将以相同的速度运行。你知道如何生成解释吗?@luqita No,explain select,not explain table。它将为您提供一个表,其中包含有关如何处理查询的信息。当试图找到最快的查询方式时,这是非常宝贵的。@luqita不,行数从81729到81681的变化是没有意义的。您有一个完整的表扫描和文件排序-即最坏的结果。查询有时看起来更快的原因是它被缓存了。您对索引所做的更改无效。但这没有意义-它至少应该使用索引进行排序。@luqita我发现了一个关于这个问题的错误报告:看起来你需要强制使用索引
SELECT*FROM users强制索引(email)按email排序
顺便说一句,我无法让MySQL在任何测试中使用索引进行排序,除非强制使用索引。