mysql修复使用where;

mysql修复使用where;,mysql,sql,indexing,query-optimization,where,Mysql,Sql,Indexing,Query Optimization,Where,我的SQL查询: SELECT * FROM updates_cats WHERE uid =118697835834 ORDER BY created_date ASC 当前索引: index1(uid, created_date) 解释扩展结果: 1 SIMPLE updates_cats ref index1 index1 8 const 2 100.00 Using where 如何修复它使用where的额外字段,以便它可以使用索引 编辑:显示创建表: CREATE TABLE `

我的SQL查询:

SELECT *
FROM updates_cats
WHERE uid =118697835834
ORDER BY created_date ASC
当前索引:

index1(uid, created_date)
解释扩展结果:

1 SIMPLE updates_cats ref index1 index1 8 const 2 100.00 Using where
如何修复它使用where的额外字段,以便它可以使用索引

编辑:显示创建表:

CREATE TABLE `updates_cats` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `u_cat_id` bigint(20) NOT NULL DEFAULT '0',
 `uid` bigint(20) NOT NULL,
 `u_cat_name` text COLLATE utf8_unicode_ci NOT NULL,
 `total_updates` int(11) unsigned NOT NULL DEFAULT '0',
 `created_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 PRIMARY KEY (`id`),
 KEY `index1` (`uid`,`created_date`)
) ENGINE=MyISAM AUTO_INCREMENT=23522 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

唯一比使用where更好的方法是使用where;使用带有“覆盖索引”的索引。尝试只选择
uid
created\u date

使用where
可以。这意味着它将指定的索引应用于
WHERE
子句,并减少返回的行数。要去掉它,必须去掉
WHERE
子句

以下是您应该关注的事项:

  • 使用文件排序
  • 使用临时文件
  • 不使用索引:
    EXPLAIN
    的“key”列中的
    NULL
    ,以及“rows”列中的大量行
您的
EXPLAIN
结果显示MySQL正在对
WHERE
子句应用
index1
,并返回两行:

1 SIMPLE updates_cats ref index1 index1 8 const 2 100.00 Using where

+1对于合理的问题。但是删除了php标记。@fxuser:该表有多少行?如果数量太少,则tb eindex可能不会被起诉。@ypercube显示第0-29行(总计23521行,查询耗时0.0005秒)。您能告诉我们更新中的
SELECT COUNT(*)和
SELECT COUNT(*)是什么吗从更新中,uid=118697835834
show?我还添加了show CREATE TABLE-第一行显示:23521-第二行显示:2因为我使用了SELECT*这意味着我需要表中的大部分(如果不是全部)列。。。那么,如果我选择uid,created_date only,会有什么帮助呢?请使用
uid
created_date
进行尝试。您的
EXPLAIN
将使用索引显示
,这意味着MySQL能够直接从索引返回整个结果集,而无需访问实际的表数据。这样可以防止两次搜索,每返回一行一次。如果您选择的是
文本
字段,则无论如何都不能使用覆盖索引,因此请坚持使用现有的索引。阅读有关“”的内容。刚尝试过,但它将返回php错误,即一个变量试图获取未在SELECT中指定的列…我建议使用
EXPLAIN
运行它以查看差异,而不是在应用程序中更改它。无法从未返回的列中获取PHP中的值。