Mysql性能优化之索引优化!

1.为什么使用索引优化??

数据量少的时候 我们的查询速度可能并不影响项目
但是数据量多的时候 查询速度会明显变慢 怎么慢?
浏览器获取数据时一直转圈 而你的网速又不慢 加载速度却很慢
用户体验很是糟糕的
通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义

索引是一种数据,可以避免了全表查询,可以类比目录和书

2.索引为什么能加快?

DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度

3.那些列适合建索引

经常作为查询条件的列
经常作为排序条件的列
经常作为join条件的列

4.那些列字段不适合索引

频繁修改的列
区分度不高的列,如性别
不经常作为查询条件,排序条件,连接的列

5.如何使用索引进行性能优化呢?

本例是创建一个简单的索引,名为 "PersonIndex",在 Person 表的 LastName 字段:

CREATE INDEX PersonIndex ON Person (LastName) 

6.索引在什么时候会失效

SELECT * FORM USER where username LIKE '慕白%'

如果username建立了索引 那么这条sql语句会生效

SELECT * FORM USER where username like '%慕白'

这一条sql语句将通配符放到了关键字前面 这时索引会失效

SELECT * FORM user where username like '%慕白%'

这一条sql语句运用了前后通配 索引也会失效

2.还有些时候索引也会失效 字段值覆盖全部数据30%时也会自动转为全表扫描 索引也就失效了
3. 语句中出现列数据运算才判断的比如where age – 10 > 0 每一行都要运算之后才知道是否大于0 所以就是全表扫描,如果age > 10 则可使用索引。使用函数转换列数据也一样原理。
4.当语句中带有or的时候,索引会失效

7.常见的可以用于建立索引的字段场景:

① 用户id
在订单表中的用户id字段上建立索引,根据用户id筛选订单,则会很快查询出用户的订单。
用户一般是在自己的后台查看订单,所以表中的其他用户数据与他无关,如果没有建立索引,每次查询都是全表扫描,则会很慢。(我们每个人在淘宝平台上占的订单比例都不到0.0001)

② 商品名
同上,如果不建立索引,我们在淘宝输入框搜索键盘,怎么快速查询出键盘商品?

③ 日期
常用的活跃数据,一般都是是最近产生的,很少人没事去翻半年前的订单数据吧?

合适的还有很多很多场景,需要各位小伙伴自己好好思量。

说了那么多 看懂上面操作后那就来测试一下吧

首先 建一张没有索引的表然后插入1W条数据
下面是我循环插入的代码(tp5代码)

public function inserts()//循环插入1W条数据
    {
        ini_set('max_execution_time', '0');//设置不超时
        $datas = [
            'shop_user_name'=>'戴先生',
            'shop_user_password'=>'php1314.cn',
            'shop_user_shop_user_card'=>'3415122612232'
        ];

        for ($i=1; $i <10000 ; $i++) { 
            db('shop_user')->insert($datas);
        }
        unset($datas);//销毁插入的数据数组

    }

这时候数据库已经有了9999条数据了(php太强悍,秒查出….)
但这不影响我们对索引的探索
因为我们可以对比索引失效与不失效的查询时间
我们分别运行以下sql语句

SELECT* FORM USER where username like '%戴先生'
select * form user where username like '戴先生%'

为您推荐

评论已关闭