我有一个要更改的 InnoDB 表。该表有大约 80M 行,并退出了一些索引。
我想更改其中一列的名称并添加更多索引。
alter table
,最快的解决方案吗?这个时候,我只关心速度 :)
我运行一个EXPLAIN
:
mysql> explain select last_name from employees order by last_name;
+----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+
| 1 | SIMPLE | employees | ALL | NULL | NULL | NULL | NULL | 10031 | Using filesort |
+----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
我表中的索引:
mysql> show index from employees;
+-----------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | …
Run Code Online (Sandbox Code Playgroud) 在 MYSQL 状态下,Handler_read_rnd_next 值非常高。
我知道,当执行没有正确索引的查询时,此值将增加。
但是,即使我们执行像“Handler_read_rnd_next”这样的显示状态,这个值也会增加 2。
基于这个状态标志,我们正在监控一些统计数据。
所以每一次,这个统计数据都显示出关键性。
我们能否从“Handler_read_rnd_next”计数中排除这些“显示”执行计数。
再举一个例子,
有一个 10 行的表,表在列 'data' 上建立索引,如果我们执行以下查询:
select data from test where data = 'vwx' -> returns one row
Run Code Online (Sandbox Code Playgroud)
如果我们检查 'Handler_read_rnd_next' 的值,它会增加 7。
以下是上述查询的解释命令的结果:
explain select data from test where data = 'vwx';
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, 'SIMPLE', 'test', 'ref', 'data', 'data', '35', 'const', 1, 'Using where; Using index'
Run Code Online (Sandbox Code Playgroud)
有没有办法限制这个值,或者我能知道为什么这个值增加得非常快。
我有两个疑问,
select some_other_column
from `table`
order by primary_index_column asc
limit 4000000, 10;
Run Code Online (Sandbox Code Playgroud)
和
select some_other_column
from `table`
order by secondary_index_column asc
limit 4000000, 10;
Run Code Online (Sandbox Code Playgroud)
两者都返回 10 行;第一个需要 2.74 秒,第二个需要 7.07 秒。 some_other_column
不是任何索引的一部分。 primary_index_column
是主键列;secondary_index_column
有一个 b 树索引和 200 的基数(根据 MySQL)。
下面是explain
结果:
mysql> explain select some_other_column from `table` order by primary_index_column limit 4000000, 10;
+----+-------------+---------+-------+---------------+---------+---------+------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+------+---------+-------+ …
Run Code Online (Sandbox Code Playgroud) 我有一个source
基数为 1122 的索引和一个state
基数为 22 的state
索引。MySQL在查询时一直使用该索引SELECT C1 FROM tbl WHERE source = 'x' and state = 'y'
。这是正常的吗?如果没有,可能会出现什么问题?
我有一个基本表:
create table fullTextTest
(
id INT(11) NOT NULL,
superText CHAR(255) NOT NULL,
superLongText TEXT NOT NULL,
primary key (`id`),
FULLTEXT KEY `superText` (`superText`),
FULLTEXT KEY `superLongtext` (`superLongtext`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
insert into fullTextTest
set id=1,
superText="Hi guys, how is it goin'?",
superLongtext="Please give me some dummy text to search on!!!"
;
show index from fullTextTest;
| fullTextTest | 0 | PRIMARY | 1 | id | A | 1 | NULL | NULL | | BTREE | | …
Run Code Online (Sandbox Code Playgroud) 假设我有一个包含 2938347 行的 MyISAM 表(以及其他表)。此表仅用于日志记录,不会经常清空。
如果不定期归档或删除这些行,是否保留该表会影响服务器性能?
那么,MySQL 服务器上的表/数据库大小如何,但不经常访问。这些表与经常访问/查询的表共存,我想知道它们是否导致问题。
大流士
我正在将分页添加到我的“最新消息”php 脚本中,但遇到了一个问题。
SELECT sid, title, time, bodytext, author, url FROM news WHERE approved=1 ORDER BY time desc LIMIT $start, $limit
Run Code Online (Sandbox Code Playgroud)
我在批准的时间列上有索引。
问题是当我对查询执行 EXPLAIN 时,它显示它正在使用“已批准”索引 - 但它仍然必须扫描所有 1000 行才能获得我想要显示的 10 个新条目。
无论如何要优化查询,以免发生这种情况?
这对我来说是一个相当令人困惑的问题。我有一个充满棒球统计数据的数据库。运行此查询:
SELECT * FROM hits
JOIN stadiums ON stadiums.gameName = hits.gameName
JOIN players ON (players.gameName = hits.gameName AND players.id = hits.batter)
JOIN games ON games.gameName = hits.gameName
WHERE games.type = 'R'
LIMIT 50
Run Code Online (Sandbox Code Playgroud)
返回:
/* 0 rows affected, 50 rows found. Duration for 1 query: 0.218 sec. */
Run Code Online (Sandbox Code Playgroud)
但是运行这个查询:
SELECT * FROM hits
JOIN stadiums ON stadiums.gameName = hits.gameName
JOIN players ON (players.gameName = hits.gameName AND players.id = hits.batter)
JOIN games ON games.gameName = hits.gameName
WHERE games.leagueLevel = 'mlb'
LIMIT …
Run Code Online (Sandbox Code Playgroud) mysql ×9
index ×3
innodb ×3
myisam ×3
optimization ×3
performance ×2
alter-table ×1
ddl ×1
explain ×1
mysql-5 ×1
order-by ×1
query ×1
rdbms ×1