这是我的MYSQL表演示,它有超过700万行;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | varchar(42) | YES | MUL | NULL | |
| date | datetime | YES | MUL | NULL | |
| text | varchar(100) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+我看到索引是按顺序工作的。
案例1:
select * from demo where id="43984a7e-edcf-11ea-92c7-509a4cb89342" order by date limit 30;我创建了(id,date)索引,它运行良好,查询执行得太快了。
但请继续看下面的案例。
案例2:
下面是我的SQL查询。
select * from demo where id>"43984a7e-edcf-11ea-92c7-509a4cb89342" order by date desc limit 30;为了更快地执行上述查询,我在(id,date)上创建了一个索引。但这需要超过10秒。然后我又在(日期)上做了另一个索引。花了不到1秒的时间。为什么复合索引(id,date)在这种情况下比(日期)索引慢得多??
案例3:
select * from demo where id<"43984a7e-edcf-11ea-92c7-509a4cb89342" order by date desc limit 30;对于此查询,甚至(日期)索引也要花费超过1.8秒的时间。为什么<运算符没有使用任何索引(日期)或(id,日期)进行优化。即使是这个查询也只是经过了大约300行,并且花费了1.8秒以上,为什么呢?
mysql> explain select * from demo where id<"43984a7e-edcf-11ea-92c7-509a4cb89342" order by date desc limit 30;
+----+-------------+-------+------------+-------+-----------------------+------------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+-----------------------+------------+---------+------+------+----------+-------------+
| 1 | SIMPLE | demo | NULL | index | demoindex1,demoindex2 | demoindex3 | 6 | NULL | 323 | 36.30 | Using where |
+----+-------------+-------+------------+-------+-----------------------+------------+---------+------+------+----------+-------------+对于如何在案例3中创建索引以优化索引,有什么建议吗?
发布于 2020-09-03 14:53:18
在第一个查询中,索引可以用于where子句和排序。所以会很快的。
对于第二个查询,索引只能用于where子句。由于不平等,有关date的信息不再有序。所以引擎需要显式地订购。
此外,我认为第二个查询返回的数据比第一个查询要多得多--如果排序需要10秒的话,会有相当数量的数据。
https://stackoverflow.com/questions/63726180
复制相似问题