索引是数据库优化中最常见也 最重要的手段之一,通过索引通常可以帮助用户解决大多数的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

Java 数据库优化之索引优化

它是一个简单的单表查询SIMPLE,而且查询的表是t1,里面搜索的结果是1行,所以类型是const.possible_keys: PRIMARY可能应用到的索引是主键,实际应用索引key:PRIMARY,影响的行数rows 是1行,

使用索引长度ken_len: 4

执行解释:DESC SELECT * FROM t1 WHERE NAME="admin4";

Java 数据库优化之索引优化

解释:单表查询 查询表t1  索引没用到,影响行数是5行   type:all  效率较低 

咱们给它加索引吧:

ALTER TABLE t1 ADD INDEX in_name(NAME)

查看t1表下面的字段信息

DESC t1;

Java 数据库优化之索引优化

打上索引后咱们再来查看一下执行过程:

DESC SELECT * FROM t1 WHERE NAME="admin4";

Java 数据库优化之索引优化

最后印象行数rows 变成了1  ,现在是5行   如果生产线上是5000万条数据了,这就是别人效率笔记快5000万倍的原因了。一定要看影响行数啊  这个决定了你查询时间啊,能不能在生产线上使用就看它了查找了多少行就代表影响了多少行

所以:索引的使用是提高select操作性能的最佳途径啊

下面介绍如何使用索引:

  1. 对于创建多列索引,只要查询的条件中用到最左边的列,索引一般会使用,如下创建一个复合索引

      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%";

Java 数据库优化之索引优化

DESC SELECT * FROM t1 WHERE NAME LIKE "%5";

Java 数据库优化之索引优化

3.如果那一列为空null  搜索哪一行为空也将用到索引

下面我们给t1表新插入一条name为空的行

INSERT INTO t1(NAME) VALUES(NULL)

然后执行查询

DESC SELECT * FROM t1 WHERE NAME IS NULL;

Java 数据库优化之索引优化

查询非空也用到了索引啊

DESC SELECT * FROM t1 WHERE NAME IS NOT NULL;

Java 数据库优化之索引优化

这些测试是告诉大家 你用了索引 在写查询语句的时候要注意 别搞了半天的索引用的时候又没用上,查询变慢对资源消耗很大啊,别一条sql语句执行了到第二天还没搞完啊,这就尴尬了啊!当然开个玩笑

二:存在索引但不使用索引的介绍

  1. 如果Mysql使用索引比全部扫描更慢,则不宜用索引,例如如果key_part1均匀分布在1-100之间,查询时使用索引就不太好。这个是mysql自己估计的。
    select * from table_name where key_part1>1 and key_part<90;
  2. 如果在使用查询时 用到 where or的组合方式   那么   or或者是件列必须都是索引列啊索引才生效测试:DESC SELECT * FROM t1 WHERE id =1 or name=”admin1Java 数据库优化之索引优化

        这里name上面的索引:

        ALTER TABLE t1 DROP INDEX in_name;

        测试:DESC SELECT * FROM t1 WHERE id =1 or name=”admin1

        Java 数据库优化之索引优化

       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%'

Java 数据库优化之索引优化

 

相关文章: