sql学习笔记(18)-----------数据库创建过程(五)

2015-07-24 08:11:21 · 作者: · 浏览: 19
,索引一般就会被使用。如下创建一个复合索引。
?
mysql>create index ind_sales2_com_mon on sales2(company_id,moneys);
然后按company_id进行查询,发现使用到了复合索引
?
mysql>explain select * from sales2 where company_id=2006\G
使用下面的查询就没有使用到复合索引。
?
mysql>explain select * from sales2 where moneys=1\G
(2) 使用like的查询,后面如果是常量并且只有%号不在第一个字符,索引才可能会被使用,如下:
?
mysql> explain select * from company2 where name like"%3"\G?
*************************** 1. row ***************************?
id: 1?
select_type: SIMPLE?
table: company2?
type: ALL?
possible_keys: NULL?
key: NULL?
key_len: NULL?
ref: NULL?
rows: 1000?
Extra: Using where?
1 row inset (0.00 sec)
?
如下这个使用到了索引,而下面例子能够使用索引,区别就在于“%”的位置不同,上面的例子是吧“%”放在了第一位,而下面的例子则没有
?
mysql> explain select * from company2 where name like"3%"\G?
*************************** 1. row ***************************?
id: 1?
select_type: SIMPLE?
table: company2?
type: range?
possible_keys: ind_company2_name?
key: ind_company2_name?
key_len: 11?
ref: NULL?
rows: 103?
Extra: Using where?
1 row inset (0.00 sec)
?
(3)如果对大的文本进行搜索,使用全文索引而不使用like“%...%”.
?
(4)如果列名是索引,使用column_name is null将使用索引。如下
?
mysql> explain select * from company2 where name is null\G?
*************************** 1. row ***************************?
id: 1?
select_type: SIMPLE?
table: company2?
type: ref?
possible_keys: ind_company2_name?
key: ind_company2_name?
key_len: 11?
ref: const?
rows: 1?
Extra: Using where?
1 row inset (0.00 sec)
?
存在索引但不使用索引
(1)如果MySQL估计使用索引比全表扫描更慢,则不使用索引。例如如果列key_part1均匀分布在1到100之间,查询时使用索引就不是很好
?
1
mysql>select* from table_name where key_part1>1 and key_part<90;
(2)如果使用MEMORY/HEAP表并且where条件中不使用“=”进行索引列,那么不会用到索引。Heap表只有在“=”的条件下会使用索引。
?
(3)用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
?
mysql>show index from sales\G?
*************************** 1. row ***************************?
……?
key_name: ind_sales_year?
seq_in_index:1?
Column_name: year?
……
?
从上面可以发现只有year列上面有索引。来看如下的执行计划。
?
mysql> explain select * from sales where year=2001 or country=‘China'\G?
*************************** 1. row ***************************?
id: 1?
select_type: SIMPLE?
table: sales?
type: ALL?
possible_keys: ind_sales_year?
key: NULL?
key_len: NULL?
ref: NULL?
rows: 12?
Extra: Using where?
1 row inset (0.00 sec)
?
(4)如果不是索引列的第一部分,如下例子:可见虽然在money上面建有复合索引,但是由于money不是索引的第一列,那么在查询中这个索引也不会被MySQL采用。
?
mysql> explain select * from sales2 where moneys=1 \G?
*************************** 1. row ***************************?
id: 1?
select_type: SIMPLE?
table: sales2?
type: ALL?
possible_keys: NULL?
key: NULL?
key_len: NULL?
ref: NULL?
rows: 1000?
Extra: Using where?
1 row inset (0.00 sec)
(5)如果like是以%开始,可见虽然在name上面建有索引,但是由于where 条件中like的值的“%”在第一位了,那么MySQL也会采用这个索引。
?
(6)如果列类型是字符串,但在查询时把一个数值型常量赋值给了一个字符型的列名name,那么虽然在name列上有索引,但是也没有用到。
?
mysql> explain select * from company2 where name name=294\G?
*************************** 1. row ***************************?
id: 1?
select_type: SIMPLE?
table: company2?
type: ALL?
possible_keys: ind_company2_name?
key: NULL?
key_len: NULL?
ref: NULL?