zoukankan      html  css  js  c++  java
  • mysql建立索引

    建立索引常用的规则如下: 

    1、表的主键、外键必须有索引;
    2、数据量超过300的表应该有索引;
    3、经常与其他表进行连接的表,在连接字段上应该建立索引;
    4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
    5、索引应该建在选择性高的字段上;
    6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
    7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引; C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段; E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
    8、频繁进行数据操作的表,不要建立太多的索引;
    9、删除无用的索引,避免对执行计划造成负面影响; 以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大
    1.添加PRIMARY KEY(主键索引) 
    mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 
    2.添加UNIQUE(唯一索引) 
    mysql>ALTER TABLE `table_name` ADD UNIQUE ( 
    `column` 

    3.添加INDEX(普通索引) 
    mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 
    4.添加FULLTEXT(全文索引) 
    mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 
    5.添加多列索引 
    mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
    前言:本文简单讲述全文索引的应用实例,MYSQL演示版本5.5.24。
    Q:全文索引适用于什么场合?
    A:全文索引是目前实现大数据搜索的关键技术。
    至于更详细的介绍请自行百度,本文不再阐述。
    --------------------------------------------------------------------------------
    一、如何设置?



    如图点击结尾处的{全文搜索}即可设置全文索引,不同MYSQL版本名字可能不同。

    二、设置条件
    1.表的存储引擎是MyISAM,默认存储引擎InnoDB不支持全文索引(新版本MYSQL5.6的InnoDB支持全文索引)
    2.字段类型:char、varchar和text

    三、配置
    my.ini配置文件中添加
    # MySQL全文索引查询关键词最小长度限制
    [mysqld]
    ft_min_word_len = 1
    保存后重启MYSQL,执行SQL语句

    复制代码代码如下:

    SHOW VARIABLES

    查看ft_min_word_len是否设置成功,如果没设置成功请确保
    1.确认my.ini正确配置,注意不要搞错my.ini的位置
    2.确认mysql已经重启,实在不行重启电脑
    其他相关配置请自行百度。
    注:重新设置配置后,已经设置的索引需要重新设置生成索引
     
    四、SQL语法
    首先生成temp表
    复制代码代码如下:

    CREATE TABLE IF NOT EXISTS `temp` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `char` char(50) NOT NULL,
      `varchar` varchar(50) NOT NULL,
      `text` text NOT NULL,
      PRIMARY KEY (`id`),
      FULLTEXT KEY `char` (`char`),
      FULLTEXT KEY `varchar` (`varchar`),
      FULLTEXT KEY `text` (`text`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
    INSERT INTO `temp` (`id`, `char`, `varchar`, `text`) VALUES
    (1, 'a bc 我 知道 1 23', 'a bc 我 知道 1 23', 'a bc 我 知道 1 23');

    搜索`char`字段 'a' 值
    复制代码代码如下:

    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a')

    但是你会发现查询无结果?!
    这时你也许会想:哎呀怎么回事,我明明按照步骤来做的啊,是不是那里漏了或者错了?
    你不要着急,做程序是这样的,出错总是有的,静下心来,着急是不能解决问题的。

    如果一个关键词在50%的数据出现,那么这个词会被当做无效词。
    如果你想去除50%的现在请使用IN BOOLEAN MODE搜索
    复制代码代码如下:

    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a' IN BOOLEAN MODE)

    这样就可以查询出结果了,但是我们不推荐使用。
    全文索引的搜索模式的介绍自行百度。

    我们先加入几条无用数据已解除50%限制
    复制代码代码如下:

    INSERT INTO  `temp` (
    `id` ,
    `char` ,
    `varchar` ,
    `text`
    )
    VALUES (
    NULL ,  '7',  '7',  '7'
    ), (
    NULL ,  '7',  '7',  '7'
    ), (
    NULL ,  'a,bc,我,知道,1,23',  'a,bc,我,知道,1,23',  'a,bc,我,知道,1,23'
    ), (
    NULL ,  'x',  'x',  'x'
    );

    这时你执行以下SQL语句都可以查询到数据
    复制代码代码如下:

    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a');
    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('bc');
    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('我');
    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('知道');
    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('1');
    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('23');

    以下SQL搜索不到数据
    复制代码代码如下:

    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('b');
    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('c');
    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('知');
    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('道');
    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('2');
    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('3');

    如果搜索多个词,请用空格或者逗号隔开
    复制代码代码如下:

    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a x');
    SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a,x');

    上面的SQL都可以查询到三条数据

    五、分词
    看到这里你应该发现我们字段里的值也是分词,不能直接插入原始数据。
    全文索引应用流程:
    1.接收数据-数据分词-入库
    2.接收数据-数据分词-查询
    现在有个重要的问题:怎么对数据分词?
    数据分词一般我们会使用一些成熟免费的分词系统,当然如果你有能力也可以自己做分词系统,这里我们推荐使用SCWS分词插件。
    首先下载
    1.php_scws.dll  注意对应版本
    2.XDB词典文件
    3.规则集文件
    下载地址
     
    安装scws
    1.先建一个文件夹,位置不限,但是最好不要中文路径。
    2.解压{规则集文件},把xdb、三个INI文件全部扔到 D:scws
    3.把php_scws.dll复制到你的PHP目录下的EXT文件夹里面
    4.在 php.ini 的末尾加入以下几行:
    [scws]

    ; 注意请检查 php.ini 中的 extension_dir 的设定值是否正确, 否则请将 extension_dir 设为空,
    ; 再把 php_scws.dll 指定为绝对路径。

    extension = php_scws.dll
    scws.default.charset = utf8
    scws.default.fpath = "D:scws"
    5.重启你的服务器
    测试
    复制代码代码如下:

    $str="测试中文分词";
    $so = scws_new();
    $so->send_text($str);
    $temp=$so->get_result();
    $so->close();
    var_dump($temp);

    如果安装未成功,请参照官方说明文档
    --------------------------------------------------------------------------------
    这样我们就可以使用全文索引技术了。

  • 相关阅读:
    CS 165 notes
    使用GDB和Valgrind调试C程序
    vi编辑器的学习使用(十四)
    vi编辑器的学习使用(十三)
    vi编辑器的学习使用(十)
    vi编辑器的学习使用(十九)
    vi编辑器的学习使用(十八)
    vi编辑器的学习使用(十一)
    vi编辑器的学习使用(十七)
    vi编辑器的学习使用(十五)
  • 原文地址:https://www.cnblogs.com/liuwenbohhh/p/4495223.html
Copyright © 2011-2022 走看看