mysql修复使用where;
我的SQL查询: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 `
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
子句
以下是您应该关注的事项:
使用文件排序
使用临时文件
- 不使用索引:
的“key”列中的EXPLAIN
,以及“rows”列中的大量行NULL
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中的值。