tips:
以前全文索引不是用MySQL来作的,用lucence作node
在title,body列上建立全文索引mysql
alter table xxx add fulltext index idx_xxx (title,body);
全文索引SQL查询,不能使用like进行,须要使用全文索引的语法redis
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE); +----+-------------------+------------------------------------------+ | id | title | body | +----+-------------------+------------------------------------------+ | 1 | MySQL Tutorial | DBMS stands for DataBase ... | | 5 | MySQL vs. YourSQL | In the following database comparison ... | +----+-------------------+------------------------------------------+ 2 rows in set (0.00 sec)
查看相关性sql
mysql> SELECT id, body, MATCH (title,body) AGAINST ('Security implications of running MySQL as root' IN NATURAL LANGUAGE MODE) AS score FROM articles WHERE MATCH (title,body) AGAINST ('Security implications of running MySQL as root' IN NATURAL LANGUAGE MODE); +----+-------------------------------------+-----------------+ | id | body | score | +----+-------------------------------------+-----------------+ | 4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 | | 6 | When configured properly, MySQL ... | 1.3114095926285 | +----+-------------------------------------+-----------------+ 2 rows in set (0.00 sec)
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); +----+-----------------------+-------------------------------------+ | id | title | body | +----+-----------------------+-------------------------------------+ | 1 | MySQL Tutorial | DBMS stands for DataBase ... | | 2 | How To Use MySQL Well | After you went through a ... | | 3 | Optimizing MySQL | In this tutorial we will show ... | | 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... | | 6 | MySQL Security | When configured properly, MySQL ... | +----+-----------------------+-------------------------------------+
一般不要使用WITH QUERY EXPANSION ,是一个两次搜索的过程,第二次搜索的搜索短语是与第一次搜索中的几个最高相关性的原始搜索短语mongodb
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' WITH QUERY EXPANSION); +----+-----------------------+------------------------------------------+ | id | title | body | +----+-----------------------+------------------------------------------+ | 5 | MySQL vs. YourSQL | In the following database comparison ... | | 1 | MySQL Tutorial | DBMS stands for DataBase ... | | 3 | Optimizing MySQL | In this tutorial we will show ... | | 6 | MySQL Security | When configured properly, MySQL ... | | 2 | How To Use MySQL Well | After you went through a ... | | 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... | +----+-----------------------+------------------------------------------+ 6 rows in set (0.00 sec)
最多见的场景:column => tag => mysql,database,it,oracle 表结构设计有问题,应该设计为一对多,一个文章对应多个tag,有张专门tag表用来反过来查oracle
相关参数:ide
ft_min_word_len = 全文检索的最小许可字符,默认4,中文一般两个字一个词语,设置为2比较好
tips:
若是可能,请尽可能先建立表并插入全部数据后再建立全文索引,而不要在建立表时就直接建立全文索引,由于前者比后者的全文索引效率要高函数
CREATE TABLE nodes ( id BIGINT(20) DEFAULT NULL, geom GEOMETRY NOT NULL, user VARCHAR(50) DEFAULT NULL, version INT(11) DEFAULT NULL, timestamp VARCHAR(20) DEFAULT NULL, UNIQUE KEY i_nodeides (id), SPATIAL KEY i_geomidx ( geom ) ) ENGINE=INNODB DEFAULT CHARSET=LATIN1;
用来存经纬度性能
alter table nodes add column tags text, add fulltext index(tags); UPDATE nodes SET tags = (SELECT GROUP_CONCAT(CONCAT(k, v) SEPARATOR ',') FROM nodetags WHERE nodetags.id = nodes.id GROUP BY nodes.id); SELECT id, ST_DISTANCE_SPHERE(POINT(- 73.951368, 40.716743), geom) AS distance_in_meters, tags, ST_ASTEXT(geom) FROM nodes WHERE ST_CONTAINS(ST_MAKEENVELOPE(POINT((- 73.951368 + (20 / lll)), (40.716743 + (20 / lll))), POINT((- 73.951368 - (20 / 111)), (40.716743 - (20 / lll)))), geom) AND MATCH (tags) AGAINST ('+thai +restaurant' IN BOOLEAN MODE) ORDER BY distance_in_meters LIMIT 10; 查询附近二十千米的泰国餐馆
tips:
地理空间索引经测试性能特别差测试
真的要这种地理空间服务功能要用5.7的GeoHash,配合函数索引
alter table nodes add column geohash varchar(128) as (st_geohash(geom,6)) virtual alter table nodes add index i_geohash_idx(geohash)
性能提高12倍,基本上用mongodb来存,最好就用redis,MySQL用的很少,快递行业的轨迹可能用获得,量也不大,只是保存一下,作最后的持久化