4.修改视图定义(ALTER VIEW)
你可以使用ALTER VIEW语句来修改已存在的视图定义。例如:
ALTER VIEW view_name AS SELECT column1, column2, ... FROM table1 WHERE condition;
通过修改视图定义,可以重新定义视图的查询逻辑、添加新的列或更改查询条件。
5.删除视图(DROP VIEW)
如果不再需要某个视图,可以使用DROP VIEW语句将其从数据库中删除。例如:
DROP VIEW view_name;
请谨慎删除视图,因为一旦删除,视图的定义和数据将无法恢复。
三、索引
1.什么是索引
索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列。否则,数据库系统将读取每条记录的所有信息进行匹配。
可以把索引比作新华字典的音序表。例如,要查“库”字,如果不使用音序,就需要从字典的 400 页中逐页来找。但是,如果提取拼音出来,构成音序表,就只需要从 10 多页的音序表中直接查找。这样就可以大大节省时间。
因此,使用索引可以很大程度上提高数据库的查询速度还有效的提高了数据库系统的性能。
2.为什么要使用索引
索引就是根据表中的一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表,实质上是一张描述索引列的列值与原表中记录行之间一 一对应关系的有序表。
索引是 MySQL 中十分重要的数据库对象,是数据库性能调优技术的基础,常用于实现数据的快速检索。
在 MySQL 中,通常有以下两种方式访问数据库表的行数据:
1.顺序访问
顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。
顺序访问实现比较简单,但是当表中有大量数据的时候,效率非常低下。例如,在几千万条数据中查找少量的数据时,使用顺序访问方式将会遍历所有的数据,花费大量的时间,显然会影响数据库的处理性能。
2.索引访问
索引访问是通过遍历索引来直接访问表中记录行的方式。
使用这种方式的前提是对表建立一个索引,在列上创建了索引之后,查找数据时可以直接根据该列上的索引找到对应记录行的位置,从而快捷地查找到数据。索引存储了指定列数据值的指针,根据指定的排序顺序对这些指针排序。
总而言之,不使用索引,MySQL 就必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间就越多。如果表中查询的列有一个索引,MySQL 就能快速到达一个位置去搜索数据文件,而不必查看所有数据,这样将会节省很大一部分时间。
我这里准备了一组上万的数据现在来测试一下索引的效率。
建立索引前,查询速度0.181s
建立索引后,查询速度0.013s
相信看完对比,你也会有所震撼,为什么小小的索引效果却有这么大!!
3.索引的优缺点
索引有其明显的优势,也有其不可避免的缺点。
优点
索引的优点如下:
- 通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
- 可以给所有的 MySQL 列类型设置索引。
- 可以大大加快数据的查询速度,这是使用索引最主要的原因。
- 在实现数据的参考完整性方面可以加速表与表之间的连接。
- 在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间
缺点
增加索引也有许多不利的方面,主要如下:
- 创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
- 索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。
- 当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。
索引可以提高查询速度,但是会影响插入记录的速度。因为,向有索引的表中插入记录时,数据库系统会按照索引进行排序,这样就降低了插入记录的速度,插入大量记录时的速度影响会更加明显。这种情况下,最好的办法是先删除表中的索引,然后插入数据,插入完成后,再创建索引。
刚刚我们在做有无索引查询效果差异的时候大家可以看到chuan创建索引的时间远远大于查询的时间,所以在非必要情况下,不要轻易创建索引。
4.何时不使用索引
索引虽好但也有不足之处,那么什么时候不该建议使用索引呢?
- 表记录太少
- 经常增删改的表
- 数据重复且分布均匀的表字段,只应该为经常查询和最经常排序的数据列建立索引(如果某个数据类包含太多的重复数据,建立索引没有太大意义)
- 频繁更新的字段不适合创建索引(会增加IO负担)
- where条件里用不到的字段不创建索引
5.索引分类
MySQL索引分为普通索引、唯一索引、主键索引、组合索引、全文索引。索引不会包含有null值的列,索引项可以为null(唯一索引、组合索引等),但是只要列中有null值就不会被包含在索引中。
5.1.普通索引
普通索引是最基本的索引,它没有任何限制;
- 创建索引语法:
create index index_name on table(column);
- 修改表结构方式添加索引:
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
- 删除索引
DROP INDEX index_name ON table
5.2.唯一索引
唯一索引与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
CREATE UNIQUE INDEX indexName ON table(column(length))
5.2.主键索引
主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值
select * from t_log where id = '07489cdafd6d4a3489884cd3c00c7b27'
利用执行计划查看
可以看到key字段下面的PRIMARY,说明使用的索引是主键(Primary Key)。
5.2.组合索引
组合索引指在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀原则。
create index idx_userid_moduleid_url on t_log(userid,moduleid,url)
注意:组合遵循最左前缀原则。那么何为最左前缀原则?
例如我们上面的案例userid字段就是我们的最左前缀,我们要使用组合索引的时候,必须带上该字段否则组合索引无效,我们利用执行计划来测试一下。
不带最左前缀
EXPLAIN select * from t_log where moduleid = '' and url = ''
可能执行的索引并没有我们刚刚创建的索引只有普通索引,走的也是普通索引。
带最左前缀(多个字段)
EXPLAIN select * from t_log where userid = '' and moduleid = '' and url = ''
在多个字段的情况下,可能走的索引有普通索引和组合索引,走的是普通索引。
带最左前缀(只有最左前缀字段)
EXPLAIN select * from t_log where userid = ''
在只有最左前缀下可能走的是组合索引,走的也是组合索引。
5.2.全文索引
MySQL提供了全文搜索(Full-Text Search)功能以实现对文本数据进行高效的搜索和匹配。全文索引是一种特殊类型的索引,用于在文本列上进行全文搜索。
使用全文索引可以加速针对文本列的搜索操作,并支持更灵活的搜索模式,例如关键词匹配、短语搜索、布尔搜索等。
要使用全文索引功能,首先需要创建一个全文索引。为了创建全文索引,需要满足以下条件:
1.表的存储引擎必须是MyISAM或InnoDB。在 MySQL 5.6 之后,InnoDB 存储引擎也支持全文索引。
2.只有 CHAR、VARCHAR 和 TEXT 类型的列可以被索引。
要在一个表的列上创建全文索引,可以使用以下语句:
CREATE FULLTEXT INDEX index_name ON table_name (column_name);
一旦全文索引创建完成,可以使用全文搜索功能。以下是几个常用的全文搜索函数:
- MATCH: 用于指定要搜索的列。
- AGAINST: 用于指定搜索的关键词。
- BOOLEAN MODE: 用于支持布尔搜索。
下面是一个使用全文索引进行搜索的例子:
SELECT * FROM table_name WHERE MATCH(column_name) AGAINST('keyword');
注意:全文索引在大量数据和复杂查询场景下性能可能有限。在某些情况下,可以考虑使用更专业的全文搜索引擎,如Elasticsearch和Solr。
总结来说,MySQL的全文索引是一种用于文本列的索引类型,可以提供高效的全文搜索功能。通过创建索引和使用相应的查询语句,可以实现对文本数据的灵活和高效的搜索。