Mysql 向表中添加索引

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

我有一个从服务器端获取数据的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 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在任何测试中使用索引进行排序,除非强制使用索引。