zoukankan      html  css  js  c++  java
  • sql模糊查询效率

         在数据库量比较大的时候通常有一些查询,例如查询文本类型的数据,存储量大,用like进行模糊查询效率实在太低

        select * from stdcontent where  content like '%武器%'

         查询结果

         总共在568148条数据中筛选出来的结果,所以耗时比较大,反应数据返回去导致使用场景中在这反回的期间,用户在等,给用户展现出来的就是卡死状态,用户还想去点击其他的,导致程序崩溃。

         解决方案:用contains关键字。

         用法:select * from stdcontent where contains([content],'"*武器*"')

         查询结果

        两条查询结果在耗时速度上相差很多,在数据方面会有所相差,具体下面

    全文索引——CONTAINS 语法 
    我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')。 

    select CompanyName from T_Enterprise where CompanyName like '%CCC%'

    查询结果:
    CompanyName
    -------------------------------- 可以查到
    CCCCCCCCC

    select CompanyName from T_Enterprise where  Contains(CompanyName,'CCC')
    查询结果:
    CompanyName
    --------------------------------查不到数据

    备注:该表已经进行全文索引!

    再换另外一个关键字来查询下、

    select COUNT(*) from T_Enterprise where CompanyName like '%公司%'      

    select COUNT(*) from T_Enterprise where  Contains(CompanyName,'公司')

    结果是使用Contains查询的记录数比Like少!

    我们通过例子来学习,假设有表 students,其中的 address 是全文本检索的列。 
    1. 查询住址在北京的学生 
    SELECT student_id,student_name 
    FROM students 
    WHERE CONTAINS( address, 'beijing' ) 
    remark: beijing是一个单词,要用单引号括起来。 

    2. 查询住址在河北省的学生 
    SELECT student_id,student_name 
    FROM students 
    WHERE CONTAINS( address, '"HEIBEI province"' ) 
    remark: HEBEI province是一个词组,在单引号里还要用双引号括起来。 

    3. 查询住址在河北省或北京的学生 
    SELECT student_id,student_name 
    FROM students 
    WHERE CONTAINS( address, '"HEIBEI province" OR beijing' ) 
    remark: 可以指定逻辑操作符(包括 AND ,AND NOT,OR )。 

    4. 查询有 '南京路' 字样的地址 
    SELECT student_id,student_name 
    FROM students 
    WHERE CONTAINS( address, 'nanjing NEAR road' ) 
    remark: 上面的查询将返回包含 'nanjing road','nanjing east road','nanjing west road' 等字样的地址。 
    A NEAR B,就表示条件: A 靠近 B。 

    5. 查询以 '湖' 开头的地址 
    SELECT student_id,student_name 
    FROM students 
    WHERE CONTAINS( address, '"hu*"' ) 
    remark: 上面的查询将返回包含 'hubei','hunan' 等字样的地址。 
    记住是 *,不是 %。 

    6. 类似加权的查询 
    SELECT student_id,student_name 
    FROM students 
    WHERE CONTAINS( address, 'ISABOUT (city weight (.8), county wright (.4))' ) 
    remark: ISABOUT 是这种查询的关键字,weight 指定了一个介于 0~1之间的数,类似系数(我的理解)。表示不同条件有不同的侧重。 

    7. 单词的多态查询 
    SELECT student_id,student_name 
    FROM students 
    WHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' ) 
    remark: 查询将返回包含 'street','streets'等字样的地址。 
    对于动词将返回它的不同的时态,如:dry,将返回 dry,dried,drying 等等。
  • 相关阅读:
    【树】树的前序遍历(非递归)
    表单提交中的input、button、submit的区别
    利用setTimeout来实现setInterval
    Jquery动画操作的stop()函数
    Javascript实现简单的双向绑定
    Javascript观察者模式
    CSS reset
    【CSS3】background-origin和background-clip的区别
    :before和::before的区别
    JS实现瀑布流
  • 原文地址:https://www.cnblogs.com/ms1976/p/8667897.html
Copyright © 2011-2022 走看看