美文网首页
mysql 索引

mysql 索引

作者: 杨杨1314 | 来源:发表于2016-11-01 09:32 被阅读33次

    索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

    首先:先假设有一张表,表的数据有10W条数据,其中有一条数据是batch_name='test111',如果要拿这条数据的话需要些的sql是 SELECT * FROM test WHERE batch_name = 'test111';

    一般情况下,在没有建立索引的时候,mysql需要扫描全表及扫描10W条数据找这条数据,如果我在batch_name上建立索引,那么mysql只需要扫描一行数据及为我们找到这条batch_name='test111'的数据,是不是感觉性能提升了好多.

    下面是几种常见的单列索引

    一:普通索引

    这个是最基本的索引,创建普通索引的格式为:

    ALTER TABLE <表名> ADD INDEX (<字段>);

    比如:

    alter table `test` add INDEX (`batch_name`);

    或者:

    CREATE INDEX batch_name ON `test`(`batch_name`);

    二:唯一索引

    ALTER TABLE  `test` ADD UNIQUE (`aty_id`);

    三:主键索引

    ALTER TABLE `table_name` ADD PRIMARY KEY ( `column ` );

    四:全文索引

    ALTER TABLE `table_name` ADD FULLTEXT ( `column`);

    解释:一般的数据库搜索都是用的SQL的 like 语句,like 语句是不能利用索引的,每次查询都是从第一条遍历至最后一条,查询效率极其低下。一般数据超过10万或者在线人数过多,like查询都会导致数据库崩溃。 这也就是为什么很多程序都只提供标题搜索的原因了,因为如果搜索内容,那就更慢了,几万数据就跑不动了。

    Mysql 全文索引是专门为了解决模糊查询提供的,可以对整篇文章预先按照词进行索引,搜索效率高,能够支持百万级的数据检索。

    查看索引:

    show keys from tablename;

    或者:

    show index from tablename;

    删除索引:

    DROP INDEX index_name ON talbe_name;

    例子:drop INDEX is_recycle ON test;

    那么,怎样确定和挑选索引列?什么样的字段适合做索引呢?

    1:最适合索引的列是出现在 WHERE 子句中的列,或连接子句中指定的列,而不是出现在 SELECT 关键字后的选择列表中的列,例如:

    SELECT

    col_a                           ←不适合作索引列

    FROM

    Tbl1 LEFT JOIN tbl2

    ON tbl1.col_b = tbl2.col_c      ←适合作索引列

    WHERE

    col_d = expr                    ←适合作索引列

    2:唯一索引:考虑某列中值的分布。对于惟一值的列,索引的效果最好,而具有多个重复值的列,其索引效果最差。例如,存放年龄的列具有不同值,很容易区分各行。

    3、使用短索引:如 果对串列进行索引,应该指定一个前缀长度,只要有可能就应该这样做。例如,如果有一个 CHAR(200) 列,如果在前 10 个或 20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。对前 10 个或 20 个字符进行索引能够节省大量索引空间,也可能会使查询更快。

    较小的索引涉及的磁盘 I/O 较少,较短的值比较起来更快。更为重要的是,对于较短的键值,索引高速缓存中的块能容纳更多的键值,因此,MySQL 也可以在内存中容纳更多的值。这增加了找到行而不用读取索引中较多块的可能性。

    4、利用最左前缀:在创建一个 n 列的索引时,实际是创建了 MySQL 可利用的 n 个索引。多列索引可起几个索引的作用,因为可利用索引中最左边的列集来匹配行。这样的列集称为最左前缀。假如一个表在分别名为 state、city 和 zip 的三个列上有一个索引。索引中的行是按 state/city/zip 的次序存放的,因此,索引中的行也会自动按 state/city 的顺序和 state 的顺序存放

    5、不要过度索引:不要以为索引“越多越好”,什么东西都用索引是错的。每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能,这一点我们前面已经介绍过。在修改表的内容时,索引必须进行更新,有时可能需要重构,因此,索引越多,所花的时间越长。

    相关文章

      网友评论

          本文标题:mysql 索引

          本文链接:https://www.haomeiwen.com/subject/mylsuttx.html