加快地理位置查询

时间:2017-11-23 17:41:05

标签: mysql database laravel geolocation

我尝试实现一个地理定位查询,该查询在具有latlng id_product和id_categories的表中搜索产品(150.000),并且查询运行速度非常慢。这是查询:

$prodottip = \App\Models\Prodotti::join('products2sellers', 'products2sellers.id_prodotto', 'prodotti.product_id')->where('prodotti.id_tipologia', 'PRODUCT')->join('aziende', 'products2sellers.id_seller', 'aziende.Id')->select('prodotti.*', 'aziende.*')->whereRaw('match (prodotti.nome, prodotti.categoria_composta, prodotti.descrizione_lunga) against (? in boolean mode)', [$cosa])->selectRaw('( 6371 * acos( cos( radians(?) ) *
                           cos( radians( products2sellers.lat ) )
                           * cos( radians( products2sellers.lng ) - radians(?)
                           ) + sin( radians(?) ) *
                           sin( radians( products2sellers.lat ) ) )
                         ) AS distance', [$lat, $lng, $lat])->OrderBy('distance', 'ASC');

任何加快速度的建议?

这是3表的转储。 我在MariaDB上,但我也安装了MongoDB。

CREATE TABLE `aziende` (
  `Id` int(11) NOT NULL,
  `contatto` varchar(100) NOT NULL,
  `visualizzazioni` int(11) NOT NULL DEFAULT '0',
  `categoriapg` varchar(130) NOT NULL DEFAULT '',
  `titolo` varchar(50) NOT NULL DEFAULT '' COMMENT 'verrà utilizzato come nome aziendale',
  `sottotitolo` varchar(255) NOT NULL DEFAULT '' COMMENT 'slogan aziendale',
  `immagine` varchar(50) NOT NULL,
  `logo` varchar(50) NOT NULL,
  `IndirizzoGeolocalizzato` varchar(250) NOT NULL DEFAULT '',
  `email` varchar(100) NOT NULL DEFAULT '' COMMENT 'email ufficiale',
  `telefono` varchar(20) NOT NULL DEFAULT '' COMMENT 'telefono ufficiale',
  `sitoweb` varchar(150) NOT NULL DEFAULT '' COMMENT 'sito web ufficiale',
  `visualizza` int(1) NOT NULL DEFAULT '2',
  `scadenzacontratto` datetime NOT NULL,
  `ultimouser` varchar(13) NOT NULL DEFAULT '',
  `ragionesociale` varchar(255) NOT NULL DEFAULT '',
  `piva` varchar(30) NOT NULL DEFAULT '',
  `codfisc` varchar(20) NOT NULL DEFAULT '',
  `agente` int(11) NOT NULL,
  `Provincia` varchar(50) NOT NULL DEFAULT '0',
  `Citta` varchar(250) NOT NULL DEFAULT '0',
  `attiva` int(11) NOT NULL,
  `id_utente` int(11) NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `entry_by` int(11) NOT NULL DEFAULT '0',
  `descrizione_azienda` longtext NOT NULL,
  `tag_title` varchar(100) NOT NULL,
  `tag_description` varchar(100) NOT NULL,
  `keywords` varchar(100) NOT NULL,
  `coupon` varchar(20) NOT NULL,
  `sconto` int(11) NOT NULL,
  `partner` int(11) NOT NULL,
  `lat` double NOT NULL,
  `long` double NOT NULL,
  `regione` varchar(30) NOT NULL,
  `nazione` varchar(30) NOT NULL,
  `via` varchar(100) NOT NULL,
  `cap` varchar(10) NOT NULL,
  `condizioni_vendita` longtext NOT NULL,
  `condizioni_spedizione` longtext NOT NULL,
  `cellulare` varchar(50) NOT NULL,
  `id_piano` int(11) NOT NULL,
  `citta_fatturazione` varchar(300) NOT NULL,
  `via_fatturazione` varchar(300) NOT NULL,
  `civico_fatturazione` varchar(20) NOT NULL,
  `stato_fatturazione` varchar(30) NOT NULL,
  `cap_fatturazione` int(10) NOT NULL,
  `provincia_fatturazione` varchar(20) NOT NULL,
  `regione_fatturazione` varchar(10) NOT NULL,
  `lat_fatturazione` double NOT NULL,
  `long_fatturazione` double NOT NULL,
  `indirizzo_fatturazione` varchar(300) NOT NULL,
  `categoria` int(11) NOT NULL,
  `numero_civico_fatturazione` varchar(20) NOT NULL,
  `numero_civico` varchar(12) NOT NULL,
  `sla1` float NOT NULL,
  `sla2` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='aziende promotrici';

-- --------------------------------------------------------

--
-- Struttura della tabella `prodotti`
--

CREATE TABLE `prodotti` (
  `id` int(11) NOT NULL,
  `id_tipologia` varchar(50) NOT NULL,
  `categoria_principale` varchar(110) DEFAULT NULL,
  `nome` varchar(50) DEFAULT NULL,
  `immagini` varchar(1000) DEFAULT NULL,
  `entry_by` int(11) NOT NULL,
  `id_produttore` varchar(255) DEFAULT NULL,
  `id_unita_misura` int(11) NOT NULL,
  `prezzo` float DEFAULT NULL,
  `link_statico` varchar(100) DEFAULT NULL,
  `attivo` int(11) NOT NULL,
  `numero_visualizzazioni` int(11) NOT NULL,
  `quantita_magazzino` int(11) DEFAULT NULL,
  `backorders` int(11) NOT NULL,
  `codice_sku` varchar(10) DEFAULT NULL,
  `pagamenti_abilitati` varchar(50) NOT NULL,
  `spedizioni_abilitate` varchar(50) NOT NULL,
  `tags` text NOT NULL,
  `tag_title` text NOT NULL,
  `tag_keywords` text NOT NULL,
  `tag_description` text NOT NULL,
  `id_gruppi_utenti` varchar(10) NOT NULL,
  `vetrina_on` int(11) NOT NULL,
  `numero_acquisti` int(11) DEFAULT '0',
  `thumbnail` varchar(500) NOT NULL,
  `quantita_minima` int(11) DEFAULT NULL,
  `id_tasse` int(11) NOT NULL,
  `descrizione_breve` longtext,
  `descrizione_lunga` longtext,
  `negozio` varchar(50) DEFAULT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `prezzo_scontato` float DEFAULT NULL,
  `alternativi` varchar(200) NOT NULL,
  `immagine_principale` varchar(100) DEFAULT NULL,
  `rating` float DEFAULT NULL,
  `sottocategoria` varchar(500) DEFAULT NULL,
  `cod_abbonamento` int(11) NOT NULL,
  `numero_acquisto` int(11) NOT NULL,
  `featured` int(11) NOT NULL,
  `bicolors` varchar(255) DEFAULT NULL,
  `genere` varchar(250) DEFAULT NULL,
  `model_id` varchar(110) DEFAULT NULL,
  `barcode` int(11) DEFAULT NULL,
  `prezzo_acquisto` double DEFAULT NULL,
  `univoco` varchar(12) DEFAULT NULL,
  `color` varchar(255) DEFAULT NULL,
  `season` varchar(255) DEFAULT NULL,
  `product_id` int(11) NOT NULL,
  `slug` varchar(500) NOT NULL,
  `showcase` int(11) NOT NULL,
  `optimized` int(11) DEFAULT NULL,
  `materiale` varchar(300) NOT NULL,
  `peso` float NOT NULL,
  `model_qty` int(11) NOT NULL,
  `fornitore` varchar(100) NOT NULL,
  `madein` varchar(100) NOT NULL,
  `id_categoria` int(11) NOT NULL,
  `categoria_composta` varchar(250) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Struttura della tabella `products2sellers`
--

CREATE TABLE `products2sellers` (
  `id` int(11) NOT NULL,
  `id_prodotto` int(11) NOT NULL,
  `id_seller` int(11) NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `taglia` varchar(300) DEFAULT NULL,
  `colore` varchar(200) DEFAULT NULL,
  `model_id` varchar(50) DEFAULT NULL,
  `qty` int(11) DEFAULT NULL,
  `lat` double NOT NULL,
  `lng` double NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Indici per le tabelle scaricate
--

--
-- Indici per le tabelle `aziende`
--
ALTER TABLE `aziende`
  ADD PRIMARY KEY (`Id`);

--
-- Indici per le tabelle `prodotti`
--
ALTER TABLE `prodotti`
  ADD PRIMARY KEY (`id`);

--
-- Indici per le tabelle `products2sellers`
--
ALTER TABLE `products2sellers`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT per le tabelle scaricate
--

--
-- AUTO_INCREMENT per la tabella `prodotti`
--
ALTER TABLE `prodotti`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=52102;
--
-- AUTO_INCREMENT per la tabella `products2sellers`
--
ALTER TABLE `products2sellers`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=52101;COMMIT;

基本上我也可以使用预先加载来构建它,但我想结果是一样的。此外,我可以尝试在MariaDB中使用一些地理位置/插件,但我需要一些建议

0 个答案:

没有答案