mysql性能优化,EXPLAIN SELECT FROM 表名 WHERE 列名=数值1 or 列名2=数值2
时间:2016-05-30 17:31 来源:www.it.net.cn 作者:IT
表students,和索引如下
mysql> select * from students;
+-----+--------+------+-------+------------+--------------+
| id | name | sex | birth | department | address |
+-----+--------+------+-------+------------+--------------+
| 901 | 张老大 | 男 | 1985 | 计算机系 | 北京市海淀区 |
| 902 | 张老二 | 男 | 1986 | 中文系 | 北京市昌平区 |
| 903 | 张三 | 女 | 1990 | 英语系 | 北京市朝阳区 |
| 904 | 李四 | 男 | 1990 | 数学系 | 湖南省长沙市 |
+-----+--------+------+-------+------------+--------------+
4 rows in set (0.00 sec)
mysql> desc students_extra;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(10) | NO | PRI | NULL | |
| extra | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
下面的这个可以理解,因为sex没有建索引,所以没有用上索引,rows值为4
mysql> EXPLAIN SELECT * FROM students WHERE name='张三' or sex='女'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: students
type: ALL
possible_keys: index_name
key: NULL
key_len: NULL
ref: NULL
rows: 4
Extra: Using where
1 row in set (0.00 sec)
但是下面的就不理解了,为什么rows值还是4呢?
mysql> EXPLAIN SELECT * FROM students WHERE name='张三' or id=903\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: students
type: ALL
possible_keys: PRIMARY,index_name
key: NULL
key_len: NULL
ref: NULL
rows: 4
Extra: Using where
1 row in set (0.00 sec)
没有应用上索引 ,此问题 一直卡这,过两天朋友告诉我是存储类型的问题 要选择MyISAM类型的就OK了
CREATE TABLE emp(
id int primary key,
name varchar(20) not null,
age int not null
)ENGINE=myisam DEFAULT CHARSET=gbk;
INSERT INTO emp VALUES(12,'学他1',121);
INSERT INTO emp VALUES(13,'学他2',122);
INSERT INTO emp VALUES(14,'学他3',123);
INSERT INTO emp VALUES(15,'学他4',124);
INSERT INTO emp VALUES(16,'学他5',125);
ALTER TABLE emp ADD index(id);
EXPLAIN
SELECT id,name,age
FROM emp
WHERE id = 16 or name = '学他5' \G;
这样就会用上。。。。,做下笔记。
(责任编辑:IT)
表students,和索引如下 mysql> select * from students; +-----+--------+------+-------+------------+--------------+ | id | name | sex | birth | department | address | +-----+--------+------+-------+------------+--------------+ | 901 | 张老大 | 男 | 1985 | 计算机系 | 北京市海淀区 | | 902 | 张老二 | 男 | 1986 | 中文系 | 北京市昌平区 | | 903 | 张三 | 女 | 1990 | 英语系 | 北京市朝阳区 | | 904 | 李四 | 男 | 1990 | 数学系 | 湖南省长沙市 | +-----+--------+------+-------+------------+--------------+ 4 rows in set (0.00 sec) mysql> desc students_extra; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(10) | NO | PRI | NULL | | | extra | varchar(50) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) 下面的这个可以理解,因为sex没有建索引,所以没有用上索引,rows值为4 mysql> EXPLAIN SELECT * FROM students WHERE name='张三' or sex='女'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: students type: ALL possible_keys: index_name key: NULL key_len: NULL ref: NULL rows: 4 Extra: Using where 1 row in set (0.00 sec) 但是下面的就不理解了,为什么rows值还是4呢? mysql> EXPLAIN SELECT * FROM students WHERE name='张三' or id=903\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: students type: ALL possible_keys: PRIMARY,index_name key: NULL key_len: NULL ref: NULL rows: 4 Extra: Using where 1 row in set (0.00 sec) 没有应用上索引 ,此问题 一直卡这,过两天朋友告诉我是存储类型的问题 要选择MyISAM类型的就OK了 CREATE TABLE emp( id int primary key, name varchar(20) not null, age int not null )ENGINE=myisam DEFAULT CHARSET=gbk; INSERT INTO emp VALUES(12,'学他1',121); INSERT INTO emp VALUES(13,'学他2',122); INSERT INTO emp VALUES(14,'学他3',123); INSERT INTO emp VALUES(15,'学他4',124); INSERT INTO emp VALUES(16,'学他5',125); ALTER TABLE emp ADD index(id); EXPLAIN SELECT id,name,age FROM emp WHERE id = 16 or name = '学他5' \G; 这样就会用上。。。。,做下笔记。 (责任编辑:IT) |