【发布时间】:2019-03-17 00:24:24
【问题描述】:
我生成了单独的 MySQL Innodb 表,其中包含 2000、5000、10000、50000、10000、20000、50000、100 000、200 000 个元素(借助 php 循环和插入查询)。 每个表有两列:id(Primary Key INT autoincrement),number(INT UNIQUE KEY)。然后我做了同样的事情,但这次我生成了类似的表,其中 number 列没有索引。我以这样的方式生成表:列的值 number 等于索引的值 + 2:第一个元素 == 3,第 1000 个元素是 1002,依此类推。我想测试这样的查询,因为它将在我的应用程序中使用:
SELECT count(number) FROM number_two_hundred_I WHERE number=200002;
为这些表生成数据后,我想测试最坏情况查询的时间。我为此使用了 SHOW PROFILES。我做了一个假设,最坏情况的查询将对应于列 number 值为 1002、2002 等的元素,所以这里是我测试的所有查询和时间(由显示配置文件):
SELECT count(number) FROM number_two_thousand_I WHERE number=2002;
// for tables with indexed column number I used **suffix _I** in the end
// of name of the table. Here is the time for it 0.00099250
SELECT count(number) FROM number_two_thousand WHERE number=2002;
// column number is not indexed when there is no **suffix _I**
// time for this one is 0.00226275
SELECT count(number) FROM number_five_thousand_I WHERE number=5002;
// 0.00095600
SELECT count(number) FROM number_five_thousand WHERE number=5002;
// 0.00404125
结果如下:
2000 el - 索引 0.00099250 未索引 - 0.00226275
5000 el - 已编入索引 0.00095600 未编入索引 - 0.00404125
10000 el - 已编入索引 0.00156900 未编入索引 - 0.00761750
- 20000 el - 索引 0.00155850 未索引 - 0.01452820
- 50000 el - 索引 0.00051100 未索引 - 0.04127450
- 100000 el 索引 0.00121750 未索引 - 0.07120075
- 200000 el 索引 0.00095025 未索引 - 0.11406950
这里是infographic。它显示了元素数量如何取决于索引/未索引列的最坏情况查询时间。索引为红色。 当我测试速度时,我在 mysql 控制台中输入了 2 次相同的查询,因为我发现当你第一次查询时,有时查询未索引的列会更快一些,比索引一个。问题是:为什么这种对 200000 个元素的查询有时比在索引列号时对 100000 个元素的相同查询花费更少的时间。你可以看到还有其他我无法预料的结果。我问这个,因为当列号没有被索引时,结果是相当可预测的:200000 el 时间总是大于 100000。请告诉我在尝试研究 UNIQUE 索引列时我做错了什么。
【问题讨论】:
标签: mysql indexing innodb binary-search b-tree