随笔---数据库索引总结

建立索引的目的:加快查询的效率,当查询多于增删操作,适用于建立索引,建立索引的列,一旦进行增删改会进行索引的维护,也不宜大量建索引,索引会占用磁盘空间。
建立索引的地方
数据库以查询为主,在经常查询的列上
需要join的字段上,join的字段类型也应该相同
多个列建立索引,能满足最左前缀原则
主键,外键建立索引确保索引的唯一性
数据长度较小的列,索引文件小
如果一个列是比较长的字符串,为了加快这种长列的查询速度,可以为其建立前缀索引。

索引引用的原则
当插入数据为表中数据10%以上时,删除索引提高插入效率,再重新建立索引
哪些查询语句不走索引
1、没有where条件时
2、进行表达式操作,或函数操作
3、模糊查询时select* from movie where name like ‘%猫%’; 百分号在前不走索引
4、对数值进行不等操作时,不走索引,避免在索引列上使用not,!=和<>。
5、通过or连接的select* from movie where name like '猫%'or author=‘jack’;不走索引,改为select* from movie where name like ‘猫%’ union all select* from movie where author=‘jack’
6、需要进行隐式类型转换的,select name from book where version(varchar类型)=1.0,这里是从varchar类型转化为浮点类型,不会走索引,将1.0改为‘1.0’,则走索引。
7、组合索引不走最左侧原则。
8、判空 is null 或is not null
9、在索引列上,使用>=代替>。>=更高效

索引种类:
单例索引
普通索引:
create index 索引名 on 表名(要建立索引的列名)
alter table 表名 add index 索引名(要建立索引的列名)
唯一索引:唯一索引的每一个索引值只对应唯一的数据记录,这一点又与主键索引类似,但唯一索引允许null值
创建单例索引的index前加 unique
主键索引:唯一索引的基础上不允许有null值不能使用create index 等语句只能在建表时创建,alter table 表名 add primary key(列名)
组合索引

create index i_name_major_class on t_student(st_name,st_major,st_class);
alter table t_student add index i_name_major_class(st_name,st_major,st_class);

全文索引
MySQL中的全文索引是FultLeXT类型的索引
查询语法结构:

MATCH (col1,col2,...) AGAINST (expr [search_modifier])
search_modifier:
  {
       IN NATURAL LANGUAGE MODE
     | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
     | IN BOOLEAN MODE
     | WITH QUERY EXPANSION
  }

用法:

mysql> CREATE TABLE articles (
          id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
          title VARCHAR(200),
          body TEXT,
          FULLTEXT (title,body)
        ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.08 sec)

mysql> INSERT INTO articles (title,body) VALUES
        ('MySQL Tutorial','DBMS stands for DataBase ...'),
        ('How To Use MySQL Well','After you went through a ...'),
        ('Optimizing MySQL','In this tutorial we will show ...'),
        ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
        ('MySQL vs. YourSQL','In the following database comparison ...'),
        ('MySQL Security','When configured properly, MySQL ...');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM articles
        WHERE MATCH (title,body)
        AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)

SELECT COUNT(*) FROM articles
    WHERE MATCH (title,body)
    AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----------+
| COUNT(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)
--------------------- 
作者:巴掌大的脚印 
来源:CSDN 
原文:https://blog.csdn.net/qq_18377515/article/details/82712882 

猜你喜欢

转载自blog.csdn.net/qq_38973672/article/details/88364469
今日推荐