- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个像这样的表结构
comment_id primary key
comment_content
comment_author
comment_author_url
当我像
这样触发查询时explain SELECT * FROM comments ORDER BY comment_id
输出结果为
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE comments ALL NULL NULL NULL NULL 22563 Using filesort
为什么找不到我定义为主键的索引?
最佳答案
不是因为不能使用索引。这是因为优化器认为不使用索引并执行文件排序1 会更快。您应该会在 MyiSAM 和 InnoDB 表中看到不同的行为。
InnoDB 创建 PRIMARY
键作为集群键(如果没有定义主键,则创建第一个 UNIQUE
),这可用于具有 ORDER 的查询BY pk
或 WHERE pk BETWEEN low AND high
因为所有需要的值都在这个聚集键和连续位置(聚集键是表)。
MyISAM 表只有 B-tree 索引,所以如果查询使用这个索引,它必须读取整个索引并且它会以想要的顺序具有 comment_id
值(这真的很好)但是它也必须读取表格(不太好)才能获得所有其他想要的列。所以,优化器认为既然要读取表,为什么不扫描所有表并进行文件排序呢?您可以通过尝试进行测试:
SELECT comment_id FROM comments ORDER BY comment_id ;
它将使用索引而不进行文件排序,因为查询只需要存储在索引中的值。
如果你想在 MyiSAM 中有类似的(与 InnoDB)行为,你可以尝试在 (comment_id, comment_content, comment_author, comment_author_url)
上创建一个索引,然后尝试你的查询。所有需要的值都将在索引中找到并以正确的顺序排列,因此不会执行文件排序。
当然,附加索引需要的磁盘空间几乎与表一样多。
1:文件排序并不总是不好的,并不意味着文件保存在磁盘上。如果数据量较小,则在内存中执行。
关于Mysql Order by 子句使用 "FileSort",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11920953/
我有一个类似于以下内容的查询: SELECT * FROM tablename WHERE condition = 1 ORDER BY id LIMIT 1000; id是主键。我有一个索引 con
我有一些推荐表 CREATE TABLE IF NOT EXISTS `testimonials` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title
我有以下查询: SELECT * FROM shop_user_member_spots WHERE delete_flag = 0 ORDER BY date_spotte
我正在尝试创建一个选择查询,但是当我使用解释查询时,mysql 总是额外使用“使用文件排序”。 我尝试了最简单的查询,但问题并没有消失。我的表“Partidas”的结构是: CREATE TABLE
我有一个包含日期时间列的表,我按该列进行排序。无论我做什么,我总是从 EXPLAIN 中得到“使用哪里;使用文件排序”。 有没有办法让日期时间列上的 ORDER BY 不使用文件排序? 查询非常简单,
我在我的 Mysql 数据库上运行了一个 sql 查询。我有一张包含 150 万条记录的表。我正在尝试根据项目的创建者获取最近创建的 50 个项目。 这里是查询: SELECT * FROM `ite
mysql-5.6.24-win32.1432006610 我有两个用户消息表。 TMessageBody (id, body) 存储消息正文。 TMessage (id, uid, folderId
你好,这个查询正在生成这个解释,考虑到我为两列都设置了索引,这很奇怪 '1', 'SIMPLE', 'vtr_video_transactions', 'ALL', 'user_standard,us
我有一个简单的表格-> id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY by_id INT UNSIGNED NOT NULL posted_o
我有一个像这样的表结构 comment_id primary key comment_content comment_author comment_author_url 当我像 这样触发查询时 exp
我有一个包含 40,000,000 行的表,我正在尝试优化我的查询,因为花费的时间太长。 首先,这是我的 table : 创建表 恢复 ( yearMonth char(6) DEFAULT NULL
我正在尝试优化使用 order by 子句的 sql 查询。当我使用 EXPLAIN 时,查询总是显示“使用文件排序”。我正在将此查询应用于一个群组讨论论坛,其中有用户附加到帖子的标签。 这是我正在使
我正在尝试优化此查询: SELECT `posts`.* FROM `posts` INNER JOIN `posts_tags` ON `posts`.id = `posts_tags`.
子查询1: SELECT * from big_table where category = 'fruits' and name = 'apple' order by yyyymmdd desc 解释
我有一个查询比这个查询稍微复杂一点(获得最便宜的价格),但这代表了性能问题。因此查询不能更改。 我尝试创建不同的索引来加快排序速度,但没有运气。 需要什么索引才能更快地获得这个 1.4 秒的持久查询?
我有一张带有日期时间 (DATE) 和位 (PUBLIC) 的 Cars 表。 现在我想获取按 DATE 和 PUBLIC = 1 排序的行,所以我使用: select c.* from Ca
我有如下 2 个表: CREATE TABLE `ox_campaigns` ( `
我正在尝试使用 EXPLAIN 优化此 mysql 查询。有人可以帮我解决这个问题吗? EXPLAIN SELECT * FROM keyword WHERE keyword LIKE "panaso
有表格: CREATE TABLE `deal_keyword` ( `deal_id` int(11) unsigned NOT NULL default '0', `keyword_id`
我将用这样的查询来解释自己:(post_id= PRIMARY, blog_id=index ) SELECT post_id FROM posts WHERE blog_id IN (2,3,...
我是一名优秀的程序员,十分优秀!