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执行时,事务自动关闭