索引是数据库优化中最常见也 最重要的手段之一,通过索引通常可以帮助用户解决大多数的SQL性能问题。
索引的创建:
create index ind_company_name on company(name(4))
其中company表明
ind_company_name 索引名
看下我们数据库下面有多少数据库啊
show databases;
use test;
键一个表和创建主键索引;
CREATE TABLE t1(
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(30)
);
//插入数据
INSERT INTO t1(NAME) VALUES("admin1"),("admin2"),("admin3"),("admin4"),("admin5")
比较这三个语句的耗时:
SELECT * FROM t1
SELECT * FROM t1 WHERE id=4;
SELECT * FROM t1 WHERE NAME="admin4";
解析这条语句:
DESC SELECT * FROM t1 WHERE id=4
它是一个简单的单表查询SIMPLE,而且查询的表是t1,里面搜索的结果是1行,所以类型是const.possible_keys: PRIMARY可能应用到的索引是主键,实际应用索引key:PRIMARY,影响的行数rows 是1行,
使用索引长度ken_len: 4
执行解释:DESC SELECT * FROM t1 WHERE NAME="admin4";
解释:单表查询 查询表t1 索引没用到,影响行数是5行 type:all 效率较低
咱们给它加索引吧:
ALTER TABLE t1 ADD INDEX in_name(NAME)
查看t1表下面的字段信息
DESC t1;
打上索引后咱们再来查看一下执行过程:
DESC SELECT * FROM t1 WHERE NAME="admin4";
最后印象行数rows 变成了1 ,现在是5行 如果生产线上是5000万条数据了,这就是别人效率笔记快5000万倍的原因了。一定要看影响行数啊 这个决定了你查询时间啊,能不能在生产线上使用就看它了查找了多少行就代表影响了多少行
所以:索引的使用是提高select操作性能的最佳途径啊
下面介绍如何使用索引:
- 对于创建多列索引,只要查询的条件中用到最左边的列,索引一般会使用,如下创建一个复合索引
create index ind_salescom_onsales (company_id,moneys);
然后按company_id进行查询就使用到了索引,
explain select * from sales2 where company_id =20006
使用moneys进行查询就没有到了索引,
explain select * from sales2 where moneys =10
(ysql 搜索有三种啊 第一种是like 第二种是正则查询,第三种是sphinx(斯芬克斯)搜索加速,中文分词,高能显示,1000万都只要001秒的耗时,很接近百度搜索引
2.使用like查询的时候,如果%符号在第一个位置的时候,索引可能用不上啊
建议按照人的习惯思维走啊 一般你记忆那个人的名字是吧 知道他姓什么 名字可能记得不全是吧,类似于这样
DESC SELECT * FROM t1 WHERE NAME LIKE "admin%";
DESC SELECT * FROM t1 WHERE NAME LIKE "%5";
3.如果那一列为空null 搜索哪一行为空也将用到索引
下面我们给t1表新插入一条name为空的行
INSERT INTO t1(NAME) VALUES(NULL)
然后执行查询
DESC SELECT * FROM t1 WHERE NAME IS NULL;
查询非空也用到了索引啊
DESC SELECT * FROM t1 WHERE NAME IS NOT NULL;
这些测试是告诉大家 你用了索引 在写查询语句的时候要注意 别搞了半天的索引用的时候又没用上,查询变慢对资源消耗很大啊,别一条sql语句执行了到第二天还没搞完啊,这就尴尬了啊!当然开个玩笑
二:存在索引但不使用索引的介绍
- 如果Mysql使用索引比全部扫描更慢,则不宜用索引,例如如果key_part1均匀分布在1-100之间,查询时使用索引就不太好。这个是mysql自己估计的。
select * from table_name where key_part1>1 and key_part<90;
- 如果在使用查询时 用到 where or的组合方式 那么 or或者是件列必须都是索引列啊索引才生效测试:DESC SELECT * FROM t1 WHERE id =1 or name=”admin1
这里name上面的索引:
ALTER TABLE t1 DROP INDEX in_name;
测试:DESC SELECT * FROM t1 WHERE id =1 or name=”admin1
3. 如果某个列是字符串类型 而你查询的时候将这个列的条件给了一个字符型,那么该列上的索引页用不到,
这个在InnoDB 和高版本5.5以上将优化
加上索引:ALTER TABLE t1 ADD INDEX in_name(NAME);
DESC t1; 查询有没有索引啊
插入一条数据:INSERT INTO t1(NAME) VALUES("777")
查询语句:DESC SELECT * FROM t1 WHERE id =1 OR NAME="777"
三、查看索引使用情况
如果索引正在工作,Handler_read_key的值将很高,这个值代表一行被索引读到的次数
Handler_read_rnd_next的值高则意味着查询运行效率低,并且应该建立索引补救
查看索引参数使用情况 :SHOW STATUS LIKE 'Handler_read%'