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);

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

  • 相关阅读:
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    PHP extract() 函数
    PHP end() 函数
    PHP each() 函数
    PHP current() 函数
  • 原文地址:https://www.cnblogs.com/liuwenbohhh/p/4495223.html
Copyright © 2011-2022 走看看