Php 强制时SQL索引速度较慢
如果我有下表:Php 强制时SQL索引速度较慢,php,mysql,sql,windows,Php,Mysql,Sql,Windows,如果我有下表: +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | emp_no | int(11) | NO | PRI | NULL |
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int(11) | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | NO | MUL | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int(11) | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
我确实:
SELECT * FROM employees FORCE INDEX (first_name) WHERE first_name = 'Shem'
对first_name编制索引的表执行此查询比运行以下语句慢:
SELECT * FROM employees WHERE first_name = 'Shem'
下表:
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int(11) | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | NO | MUL | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int(11) | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
为什么使用索引并强制mySQL使用该索引比在first_name上没有任何索引要慢?这不是应该更快吗
解释
从名为“Shem”(无索引)的员工中选择*
从员工队伍索引(名字)中选择*,其中名字='Shem'(索引)
从名为“Shem”(索引)的员工中选择*
定时结果:
EXPLAIN SELECT…
显示了什么?他们在被强迫时都会拖拖拉拉…@BlueMonster没有人喜欢被强迫。如果你让他们自愿做你想做的事,你就赢了!:)-(别理我,我太喜欢你的问题标题了,我不得不把它翻出来)@codeargy LOL!很好,我实际上笑了出来。在这个例子中,更让我困扰的是,没有索引的结果和有索引的结果一样快。看起来MySQL在这里做了一个完整的表扫描,即使有索引可以使用。
+----+-------------+-----------+------+---------------+------------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+------------+---------+-------+------+-----------------------+
| 1 | SIMPLE | employees | ref | first_name | first_name | 44 | const | 235 | Using index condition |
+----+-------------+-----------+------+---------------+------------+---------+-------+------+-----------------------+
no index:
2.7541568279266
index - forced:
2.827162027359
index - no force:
2.721155166626