《Mysql必知必会》笔记---补充部分
1. 全文本搜索
- 并不是所有的引擎都支持全文本搜索,
只有MyISAM支持
使用LIKE和正则在搜索的确定
性能上十分差
,因为要检索所有的行很难明确控制
匹配什么不匹配什么.无法提供智能化的结果
,如果一个词没有出现则不会返回该结果
使用全文本搜索
- 必须索引被搜素的列,而且要随着数据的变换不断的改变索引
- FULLTEXT子句是建立单个列的索引,同时在定义后,mysql将会自动维护该索引
- 如果在导入数据,应该先导入数据再建立索引
SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('rabbit')
- match()代表要匹配的列,against()代表匹配的内容
- 搜索不区分大小写
- 全文本搜索一个重要部分就是
对结果进行排序
。具有较高等级的行被返回 - 匹配的等级跟词的总数和该词语出现的次数有关
查询的扩展
- 返回一个包含这个词以及与这个词有关的结果
- mysql会对数据和索引查询两遍
SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('rabbit' WITH QUERY EXPANSION)
布尔文本搜索
要匹配的词
要排斥的词
词语排列的重要程度
- 即使没有FULLTEXT索引也可以使用
- 不按照重要程度排序
SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('heavy -rope*' IN BOOLEAN MODE )
注意:
- 短词会被自动忽略
- Mysql自带一个非用词列表,搜索时会被忽略
- 如果某个词出现的频率超过50%,就会被当做非用词
- 如果总共行数少于3行,则不返回结果
- 只支持英语
2. 更新数据
- 当使用索引时,增删改数据会重新构造索引,会使查询语句进入等待的状态,降低性能
- 所以可以使用LOW_PRIOPITY
降低增删改的优先级提高性能
- 插入时使用连续的插入,可以提高性能
insert into x values(xxx),(xxx),(xxx);
- 使用插入和删除数据时
不能忽略where子句
,否则会使所有的数据进行更改
3. 视图
- 某些频繁使用的查询语句(如级联查询),可能很复杂,可以利用视图
简化查询
重用sql
保护数据
,只授予特定权限,如查询权限- 视图本身不包含数据,
只是对sql语句的一个封装
,如果需要封装复杂的sql需要先测试性能 - 视图可以和表一起使用
- 视图使用“
create view
”创建, - “
show create view viewname
” 查看已经创建的视图语句 - 很多的视图不能更新数据,因为其最大的作用就是
数据检索
CREATE VIEW pro_view AS
SELECT cust_name,cust_contact,prod_id
FROM customers c ,orders o1,orderitems o2
WHERE c.cust_id = o1.cust_id AND o2.order_num = o1.order_num ;
select * from pro_view where prod_id = 'TNT2';
4. 存储过程&触发器&管理事务
存储过程
- 如果存在多个步骤,如插入在多个表中数据、检查错误等,可以使用存储过程
- 使用存储过程比使用sql
性能要快
- 特征:
简单
、安全
、高性能
触发器
- 响应某些语句
自动执行的sql语句
,如每订购一个商品,就会减少一个库存 - 只有表支持,视图不支持
事务
- mysql使用“
start transaction
”标识事务的开始 - 当ROLLBACK和COMMIT执行时,事务自动关闭